Служба wsHttpBinding, размещенная в WCF IIS - svcutil создает прокси с помощью basicHttpBinding! - PullRequest
2 голосов
/ 26 октября 2010

Я считаю себя довольно опытным в WCF, но это поставило меня в тупик. Я не знаю, является ли это .NET Framework 4 / WCF 4 с его автоматической настройкой или что, но я получаю странное поведение. У меня в основном есть WCF 4 служба WCF, размещенная в проекте IIS. Все это работало, и затем я вошел и переключил конфигурацию с basicHttpBinding на wsHttpBinding. Я попытался обновить ссылку на службу в моем потребляющем приложении, и я получил вывод basicHttpBinding в сгенерированной конфигурации. Поэтому, конечно же, я выпал и запустил svcutil.exe против файла .svc и получил те же результаты. Это файл конфигурации (Blah заменяет имя, которое я не могу использовать публично):

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <authentication mode="Windows"></authentication>
    <identity impersonate="true"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="WSHttpEndpointBinding">
          <security mode="Message">
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Blah.Services.RONScheduler.BlahService.BlahDataServiceBehavior"
        name="Blah.Services.RONScheduler.FAMService">
        <endpoint address="BlahDataService" binding="wsHttpBinding" bindingConfiguration="WSHttpEndpointBinding"
          name="WSHttpEndpoint" contract="Blah.Services.RONScheduler.FAMService.IBlahDataService"> 
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Blah.Services.RONScheduler.BlahService.BlahDataServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Это то, что я генерирую перед тем, как вычистить ненужные вещи:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IBlahDataService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost/BlahService/BlahDataService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IBlahDataService"
                contract="IBlahDataService" name="BasicHttpBinding_IBlahDataService" />
        </client>
    </system.serviceModel>

Как видите, он игнорирует настройку wsHttpBinding в конфигурации. Что дает?

Ответы [ 2 ]

3 голосов
/ 26 октября 2010

Вы проверили привязки протокола по умолчанию, новую функцию в WCF 4 ??

По умолчанию они находятся в вашем machine.config и должны выглядеть следующим образом:

<system.serviceModel>
   <protocolMapping>
      <add scheme="http" binding="basicHttpBinding" bindingConfiguration="" />
      <add scheme="net.tcp" binding="netTcpBinding" bindingConfiguration=""/>
      <add scheme="net.pipe" binding="netNamedPipeBinding" bindingConfiguration=""/>
      <add scheme="net.msmq" binding="netMsmqBinding" bindingConfiguration=""/>
   </protocolMapping>

Так что для меня это означает, что если вы нажимаете HTTP-адрес, WCF 4 будет использовать basicHttpBinding по умолчанию.

При необходимости вы можете изменить эти привязки в ваших собственных конфигах.

Обнаружено в Введение разработчика в Windows Communication Foundation 4

2 голосов
/ 27 октября 2010

Учитывая предоставленные вами конфигурации, я предполагаю, что имя службы неверно и хост возвращается к конфигурации по умолчанию.

Убедитесь, что имя службы соответствует имени класса реализации.

Я пришел к такому выводу, потому что имя интерфейса - Blah.Services.RONScheduler.FAMService.IBlahDataService, а имя класса - Blah.Services.RONScheduler.FAMService. Похоже, после FAMService.

чего-то не хватает
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...