Добавление ссылки на службу в службу WCF в режиме webHttpBinding и в режиме безопасности приводит к неверному файлу конфигурации. - PullRequest
1 голос
/ 18 февраля 2010

Я искал и искал и не могу найти решение. Кажется, что это было бы довольно распространенным явлением для запуска ... службы REST WCF через https Когда я добавляю ссылку на службу, все прокси-классы являются правильными, и я могу создавать объекты, определенные в службе, вызывать службы и т. Д. Однако я не могу создать настроенный клиент с классами клиента прокси. Я должен подробно описать привязки, поведение и конечные точки и добавить их к клиенту. Например, что я должен уметь делать, основываясь на всех моих исследованиях:

ServiceClient = new ServiceClient();

И беги. Тем не менее, я должен сделать следующее:

WebHttpBinding serviceBinding = new WebHttpBinding(WebHttpSecurityMode.Transport);
serviceBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
EndpointAddress endPointAddress
            = new EndpointAddress(<endpointaddress>);

// Create Service Client 
ServiceClient = new ServiceClient(serviceBinding, endPointAddress);

// Add Web Behavior to the EndPoint
WebHttpBehavior webHttpBehavior = new WebHttpBehavior();
ServiceClient.Endpoint.Behaviors.Add(webHttpBehavior);

// Set up the request to POST with a wrapped request
WebInvokeAttribute postAttribute = new WebInvokeAttribute();
postAttribute.Method = "POST";
postAttribute.BodyStyle = WebMessageBodyStyle.WrappedRequest;
ServiceClient.Endpoint.Contract.Operations.Find(<operationname>).Behaviors.Add(postAttribute);

Чтобы имитировать конфигурацию услуги:

<behaviors>
      <endpointBehaviors>
        <behavior name="AspNetAjaxBehaviorXml">
          <webHttp />
        </behavior>
      </endpointBehaviors>
       <serviceBehaviors>
          <behavior name="AuthenticationServicesBehavior">
            <serviceMetadata httpsGetEnabled="true" policyVersion="Policy15" />
            <serviceDebug includeExceptionDetailInFaults="true" />
          </behavior>
          <behavior name="LoggingServicesBehavior">
             <serviceMetadata httpsGetEnabled="true" policyVersion="Policy15" />
             <serviceDebug includeExceptionDetailInFaults="true" />
          </behavior>
       </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="True" />
    <bindings>
      <webHttpBinding>
        <binding name="WebSslBinding">
          <security mode="Transport">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
       <service behaviorConfiguration="AuthenticationServicesBehavior"
          name="AuthenticationServices">
          <endpoint address="authenticate" behaviorConfiguration="AspNetAjaxBehaviorXml"
             binding="webHttpBinding" bindingConfiguration="WebSslBinding"
             name="AuthenticationEndPoint" bindingNamespace="<mynamespace>"
             contract="IService" />
       </service>

«Добавить справочник услуг» дает мне следующее:

<bindings>
   <customBinding>
    <binding name="AuthenticationEndPoint">
     <!--    WsdlImporter encountered unrecognized policy assertions in ServiceDescription 'EchoAppsServices':    -->
     <!--    <wsdl:binding name='AuthenticationEndPoint'>    -->
     <!--        <sp:HttpsToken xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">..</sp:HttpsToken>    -->
     <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
      messageVersion="Soap12" writeEncoding="utf-8">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
       maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     </textMessageEncoding>
    </binding>
   </customBinding>
  </bindings>
  <client>
   <endpoint binding="customBinding" bindingConfiguration="AuthenticationEndPoint"
    contract="AuthenticationService"
    name="AuthenticationEndPoint" />
  </client>

Я считаю, что моя неспособность создать клиент по умолчанию, работающий из коробки, связана с проблемой с WsdlImporter. Я получаю похожую ошибку при использовании svcutil:

Warning: The following Policy Assertions were not Imported:
  XPath://wsdl:definitions[@targetNamespace='<mynamespace>']/wsdl:binding[@na
me='AuthenticationEndPoint']
  Assertions:
    <sp:HttpsToken xmlns:sp='http://schemas.xmlsoap.org/ws/2005/07/securitypolic
y'>..</sp:HttpsToken>

Я уверен, что это как-то связано с моим самоподписанным сертификатом, но я не могу заставить makecert выдать мне действующий сертификат с CA, который не вызывает сбой IIS.

Сведения об окружающей среде: VS2008 XP 64bit .NET 3.5 IIS6

Заранее спасибо за любую помощь ...

Ответы [ 3 ]

1 голос
/ 18 февраля 2010

Не уверен, что это просто опечатка - но ваш код и конфигурация не совпадают.

Смотрите в своем коде:

serviceBinding.Security.Transport.ClientCredentialType = 
      HttpClientCredentialType.Windows;

но в вашей конфигурации:

<webHttpBinding>
    <binding name="WebSslBinding">
      <security mode="Transport">
        <transport clientCredentialType="None" />
      </security>
    </binding>
</webHttpBinding>

В коде вы устанавливаете HttpClientCredentialType на Windows (встроенная проверка подлинности Windows), но в конфигурации вы устанавливаете None.

Попробуйте изменить конфигурацию для использования Windows:

      <security mode="Transport">
        <transport clientCredentialType="Windows" />
      </security>

и попробуйте снова.

Если вы не получите лучших результатов: почему бы просто не обновить конфигурацию клиента вручную после импорта? Известно, что импортер WSDL время от времени допускает икоты, и чаще всего решение проблемы может быть решено только с помощью вашего мозга и ручной настройки конфигурации. Вам просто нужно скопировать разделы <endpointBehaviors> и <bindings> в конфигурацию на стороне клиента и определить раздел <client>, который ссылается на соответствующую конечную точку - это почти все.

1 голос
/ 18 февраля 2010

Если вы хотите создать прокси-классы клиента, зачем вам использовать webHttpBinding.Почему бы просто не использовать wsHttpBinding?

Весь смысл webHttpBinding заключался в том, чтобы вы могли использовать стандартные клиентские наборы Http, такие как HttpWebRequest и Microsoft.Http.HttpClient на клиенте, для доступа к службе.

0 голосов
/ 18 февраля 2010

Вы подняли хорошую мысль, но я начал с этого пути, чтобы создать веб-сервис RESTful, который можно вызывать либо с клиента, либо с сервера. Я могу назвать это прямо сейчас так, как есть, но мне нужно явно настроить серверную часть. Это неприемлемо, потому что это приложение будет развернуто для нескольких конечных пользователей, и легче изменить файл конфигурации, чем его исправлять. Я знаю, что мог бы создать несколько конечных точек, но я бы предпочел поддерживать только одну для каждой службы. Спасибо за ваш ответ.

...