2010-10-26 2 views
2

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

<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> 

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

<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> 

As вы можете видеть, что он игнорирует параметр wsHttpBinding в конфиге. Что дает?

ответ

3

Вы проверили привязки протокола по умолчанию, новую функцию в 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 по умолчанию.

Вы можете изменить эти привязки в своих собственных конфигурациях, если это необходимо.

Нашел в A Developer's Introduction to Windows Communication Foundation 4

+0

Право, я забыл об этом. Кажется, что config должен преодолеть это? Вы должны иметь возможность переопределить defqaualts с помощью конфигурации или полностью отключить всю систему конфигурации. –

+0

В «Руководстве» говорится: «Если вы только хотите переопределить его в рамках приложения, вы можете переопределить этот раздел в своем файле приложения/веб-конфигурации». –

+0

Это то, что не работает. –

2

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

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

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

Смежные вопросы