Silverlight 4 - настройка собственной службы WCF для использования SSL - PullRequest
1 голос
/ 19 мая 2011

У меня есть приложение Silverlight 4, которое использует службы WCF на том же сервере (самостоятельно). Все работает нормально, но теперь я хочу преобразовать свои службы WCF для использования SSL. Я использую CustomBindings и не могу найти комбинацию, чтобы сделать это. Я использую относительные URL на стороне клиента, и надеюсь, что это не вызывает проблемы. Вот важные биты моего файла Web.config:

    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true"  />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="6553600"/>
          <serviceTimeouts transactionTimeout="00:10:00"/>
        </behavior>
        </serviceBehaviors>
      </behaviors>

    <bindings>
      <customBinding>
        <binding name="MyApp.Web.Services.ProjectService.customBinding0"
          receiveTimeout="00:10:00" sendTimeout="00:10:00">
          <binaryMessageEncoding />
          <httpsTransport maxReceivedMessageSize="2147483647" />
        </binding>
      </customBinding>
    </bindings>
  <services>
    <service name="MyApp.Web.Services.ProjectService">
        <endpoint address="" binding="customBinding" bindingConfiguration="MyApp.Web.Services.ProjectService.customBinding0"
          contract="MyApp.Web.Services.ProjectService" />
      </service>

Мой ClientConfig выглядит так:

    <configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="CustomBinding_ProjectService">
                    <binaryMessageEncoding />
                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
           </customBinding>
       </bindings>
       <client>
            <endpoint address="../Services/ProjectService.svc" binding="customBinding"
                bindingConfiguration="CustomBinding_ProjectService" contract="SearchProxy.ProjectService"
                name="CustomBinding_ProjectService" />
     </client>
  </system.serviceModel>
</configuration>

Я просто не понимаю, как работают привязки как на сервере, так и на клиенте. Я надеюсь, что кто-то может указать мне правильное направление.

Ответы [ 2 ]

1 голос
/ 21 мая 2011

Несколько вещей:

Если вы хотите использовать SSL на локальном хосте, вам нужно будет использовать IIS Express 7.5 (или полный IIS, если вы работаете на сервере с dev - вряд ли).

Вам понадобится файл clientaccesspolicy.xml, хранящийся в корне веб-приложения:

<?xml version="1.0" encoding="utf-8"?>
    <access-policy>
       <cross-domain-access>
           <policy>
               <allow-from http-request-headers= "SOAPAction">
                   <domain uri="https://*"/>
               </allow-from>
               <grant-to>
                    <resource path="/" include-subpaths="true"/>
               </grant-to>
           </policy>
       </cross-domain-access>
     </access-policy>

Пример на стороне сервера Web.config:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding name="SecureBasicHttpBinding">
        <security mode="Transport">
          <transport clientCredentialType="Certificate" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>

  <behaviors>
    <serviceBehaviors>
      <behavior name="SomeBehavior" >
        <serviceMetadata httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
        <useRequestHeadersForMetadataAddress>
          <defaultPorts>
            <add scheme="https" port="443" />
          </defaultPorts>
        </useRequestHeadersForMetadataAddress>
      </behavior>
    </serviceBehaviors>
  </behaviors>

  <serviceHostingEnvironment>
    <serviceActivations>
      <add relativeAddress="SomeService.svc" service="MySilverlight.Web.SomeService"/>
    </serviceActivations>
  </serviceHostingEnvironment>

  <services>
    <service name="MySilverlight.Web.SomeService"
             behaviorConfiguration="SomeBehavior">

      <endpoint address="SomeService"
                binding="basicHttpBinding"
                bindingConfiguration="SecureBasicHttpBinding"
                bindingNamespace="https://MySilverlight.Web.SomeService"
                contract="MySilverlight.Web.ISomeService">
      </endpoint>

      <endpoint address="mex"
                binding="mexHttpsBinding"
                contract="IMetadataExchange" />
    </service>
  </services>
</system.serviceModel>

Пример на стороне клиента:

<?xml version="1.0" encoding="utf-8"?>
   <configuration>
      <system.serviceModel>
          <bindings>
              <basicHttpBinding>
                  <binding name="BasicHttpBinding_ISomeService" maxBufferSize="2147483647"
                       maxReceivedMessageSize="2147483647">
                      <security mode="Transport" />
                  </binding>
              </basicHttpBinding>
          </bindings>
          <client>
              <endpoint address="https://localhost/SomeService.svc/SomeService"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISomeService"
            contract="MySilverlight.Web.SomeServiceReference.ISomeService"
            name="BasicHttpBinding_ISomeService" />
         </client>
    <extensions />
    </system.serviceModel>
</configuration>

IIS 7.5 автоматически настроит ваш локальный сертификат.

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

Можете ли вы обновить сервисную ссылку на клиентском проекте? Это должно обновить файл clientconfig с правильной привязкой. Сейчас я замечаю одну вещь: вы используете для привязки клиента и для службы. Попробуйте изменить клиента на .

Кроме того, если ваше приложение SL загружено с адреса HTTP: //, то вызов службы в HTTPS считается междоменным вызовом, поэтому вам также потребуется файл междоменной политики. .

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