InvalidOperationException при использовании веб-службы WCF в Windows Phone 7

Я создал простую веб-службу WCF (следуя этому руководству: http://blogs.msdn.com/b/ericwhite/archive/2010/05/11/getting-started-building-a-wcf-web-service.aspx), поскольку я не хочу использовать пространство имен по умолчанию, поэтому я определил свое собственное пространство имен в ServiceContract, DataContract, ServiceBehavior и web.config, показанных в http://www.ilovesharepoint.com/2008/07/kill-tempuri-in-wcf-services.html

Когда я использую эту веб-службу WCF, я продолжаю получать InvlidOperationException в объявлении: не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт ABCWcfService.IABCWcfService в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации или потому, что в клиентском элементе не может быть найден элемент конечной точки, соответствующий этому контракту.

Я обнаружил, что причина связана с изменением конечной точки, которое я внес в файл web.config для настраиваемого пространства имен. Пока я включаю конечную точку, в моем клиентском коде будет это исключение.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="ABCWcfService.ABCWcfServiceBehavior" name="ABCWcfService.SkycityWcfService">
        <endpoint bindingNamespace="http://www.ABC.com/ABCWcfService" address="" binding="wsHttpBinding" contract="ABCWcfService.IABCWcfService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
      </service>      
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ABCWcfService.ABCWcfServiceBehavior">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

В клиентском коде это просто:

ABCWcfServiceClient abcWcfServiceClient = new ABCWcfServiceClient();
abcWcfServiceClient.GetWhatsOnDataAsync();
abcWcfServiceClient.GetWhatsOnDataCompleted += new EventHandler<GetDataCompletedEventArgs>(ABCWcfServiceClient_GetWDataCompleted);

Я получаю это исключение каждый раз, когда оно переходит в 1-ю строку.

Если я отключу раздел конечных точек в файле web.config, все в порядке.

Кто-нибудь может сказать мне, почему?


person Xiao Han    schedule 15.07.2012    source источник
comment
Может быть проблема в localhost? Вы где-нибудь развернули веб-сервис?   -  person Igor Ralic    schedule 15.07.2012
comment
Да, я развернул в IIS. Я не думаю, что локальный хост действительно является причиной проблемы.   -  person Xiao Han    schedule 16.07.2012


Ответы (1)


wsHttpBinding не поддерживается Windows Phone. Вместо этого используйте basicHttpBinding ...

См. http://blog.rsuter.com/?p=281.

person Rico Suter    schedule 15.07.2012
comment
Спасибо. Я обнаружил, что если я изменю конечную точку как: ‹endpoint bindingNamespace = ABC.com/ABCWcfService address = desktop / ABCWcfService / ABCWcfService.svc binding = basicHttpBinding contract = ABCWcfService.IABCWcpoint, itf› , поэтому рабочий стол - это имя моего компьютера в IIS и без раздела идентификаторов. По какой причине? Кажется, я должен использовать рабочий стол, не могу использовать localhost в адресе. - person Xiao Han; 16.07.2012