WCF Discovery .NET 4: проблема с определением конфигурации / программ - PullRequest
11 голосов
/ 23 мая 2011

У меня есть служба WCF с поддержкой обнаружения, и теперь я хочу подключить к ней клиент.

Проблема: Когда я использую конечную точку udp (1.) и пытаюсь программно обнаружить службу, она работает... Когда я использую подход App.config (2.), это не так (Ошибка: Конечные точки не обнаружены).

Мне кажется, что «результат обнаружения udp» обоих решений должен быть одинаковым, но, к сожалению, это не так ...

1.Программный подход (работает) :

Код:

        DiscoveryClient discClient = new DiscoveryClient("udpDiscoveryEndpoint");
        FindCriteria fCriteria = new FindCriteria(typeof(IAlarmServer));
        fCriteria.Duration = TimeSpan.FromSeconds(5);
        fCriteria.MaxResults = 1;
        FindResponse fResponse = discClient.Find(fCriteria);

        EndpointAddress address = fResponse.Endpoints[0].Address;
        Console.WriteLine("Address found: " + address.ToString());

Конфиг:

<system.serviceModel>
  <client>
     <endpoint name="udpDiscoveryEndpoint" kind="udpDiscoveryEndpoint" />
  </client>
</system.serviceModel>

2.Подход с App.config и подход «интегрированный в конечную точку» (не работает!) :

Код:

        var Proxy = new AlarmServerClient("IAlarmServer"); // Default client generated by Visual Studio
        Proxy.SomeMethod(); // throw no endpoints discovered exception

Конфиг:

<standardEndpoints>
  <dynamicEndpoint>
    <standardEndpoint name="discoveryDynamicEndpointConfiguration">
      <discoveryClientSettings>
        <findCriteria duration="00:00:05" maxResults="1">
          <types>
            <add name="AlarmServiceRef.IAlarmServer"/>
          </types>
        </findCriteria>
        <endpoint kind="udpDiscoveryEndpoint"/>
      </discoveryClientSettings>
    </standardEndpoint>
  </dynamicEndpoint>
</standardEndpoints>

Конфиг:

  <client>
     <endpoint binding="basicHttpBinding" bindingConfiguration="DefaultBasicHttpBinding" contract="AlarmServiceRef.IAlarmServer" name="IAlarmServer"
            kind="dynamicEndpoint"
            endpointConfiguration="discoveryDynamicEndpointConfiguration"/>
  </client>

Есть идеи, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Пара вещей, когда вы размещаете службу с обнаружением через IIS

  1. В конфигурации службы убедитесь, что имя службы соответствует имени класса, включая пространство имен
  2. .чтобы убедиться, что служба работает, прежде чем вы сможете обнаружить ее с помощью клиента.Вы можете вручную перейти к файлу .svc службы или разместить службу в AppFabric и установить для AutoStart значение true (вы также можете указать это в файле web.config)
  3. В конфигурации службы вы должны указать тип, который вы используете.Вы собираетесь использовать в критерии поиска на клиенте

Вот пример конфигурации сервера, устанавливающей конечные точки службы.Обратите внимание, что атрибут «имя» службы - это полное пространство имен для класса, реализующего службу.

Конфигурация службы

<services>
      <service name="WcfDiscovery.Services.BuzzerService" behaviorConfiguration="sb1" >
        <endpoint binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" address="" behaviorConfiguration="eb1"  />
        <endpoint kind="udpDiscoveryEndpoint"  />
      </service>
    </services>

Также убедитесь, что вы добавили поведение обнаружения в службу

Настройка службы

<serviceBehaviors>
        <behavior name="sb1">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceDiscovery />
        </behavior>
      </serviceBehaviors>

Поскольку я хочу, чтобы клиенты могли обнаруживать службу по типу (WcfDiscovery.Contracts.IAlarmServer), я также должен указать это в конфигурации поведения для конечной точки(eb1)

Service Config

<endpointBehaviors>
        <behavior name="eb1">
          <endpointDiscovery enabled="true">
            <types>
              <add name="WcfDiscovery.Contracts.IAlarmServer" />
            </types>
          </endpointDiscovery>
        </behavior>
      </endpointBehaviors>

Теперь на стороне клиента я могу обнаружить службу, используя findCriteria.Обратите внимание, что тип в критериях поиска должен совпадать с типом, выданным службой (в списке типов услуг)

Client Config

<standardEndpoints>
      <dynamicEndpoint>
        <standardEndpoint name="dynamicEndpointConfiguration">
          <discoveryClientSettings >
            <endpoint kind="udpDiscoveryEndpoint" />

            <findCriteria maxResults="2">
              <types>
                <add name="WcfDiscovery.Contracts.IAlarmServer" />
              </types>
            </findCriteria>

          </discoveryClientSettings>
        </standardEndpoint>
      </dynamicEndpoint>
    </standardEndpoints>

Вот конфигурация конечной точки клиента

Client Config

<client>
      <endpoint kind="dynamicEndpoint" name="endpoint" binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" endpointConfiguration="dynamicEndpointConfiguration" />
    </client>

Наконец, я могу обнаружить службу в консольном приложении, например:

ChannelFactory<IAlarmServer> factory = new ChannelFactory<IAlarmServer>("endpoint");
            var proxy = factory.CreateChannel();

            Console.WriteLine(proxy.SoundAlarm());

Надеюсь, это поможет!

0 голосов
/ 24 мая 2011

Разве вы не можете просто добавить ссылку на сервис в ваш клиентский проект?Он сгенерирует для вас конфигурацию.

...