Silverlight автоматически выбирает безопасный транспортный режим между http и https - PullRequest
3 голосов
/ 21 января 2011

Наше приложение Silverlight может работать в режиме http и https (SSL, используя Transport Security). В нашем файле ServiceReferences.ClientConfig мы просто настроили нашу конечную точку службы следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="DefaultEndpoint"
                 maxBufferSize="2147483647"
                 maxReceivedMessageSize="2147483647">
          <security mode="None" />
          <!-- Enable for SSL: mode="Transport" -->
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="/services/DefaultService.svc"
                binding="basicHttpBinding"
                bindingConfiguration="DefaultEndpoint"
                contract="OurNamespace.IOurContractAsync"
                name="DefaultEndpoint" />
    </client>
  </system.serviceModel>
</configuration>

Сконфигурированная конечная точка может быть доступна в обоих режимах. Это просто зависит от того, в каком контексте был загружен файл XAP: с http://example.com/slpage.html или https://example.com/slpage.html. К сожалению, мы должны вручную переключить настройку Security Mode между «None» и «Transport». Все остальное будет работать как хотелось бы. Когда для режима безопасности установлено значение «Нет» и мы осуществляем доступ через https, мы получаем исключение, что «..https был предоставлен, но http ожидался ...» и наоборот. Есть ли шанс позволить Silverlight автоматически решить, какой режим безопасности следует использовать? Какое самое простое решение этой проблемы?

Заранее спасибо

Thomas

Ответы [ 2 ]

5 голосов
/ 15 февраля 2011

В итоге мы получили следующее решение (не совсем то, что предложил Валентин, но +1 за помощь!):

ServiceReferences.ClientConfig содержит конфигурации привязки и конечной точки, подобные этой:

<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="DefaultBinding"
                 maxBufferSize="2147483647"
                 maxReceivedMessageSize="2147483647">
          <security mode="None" />
        </binding>
      </basicHttpBinding>
      <customBinding>
        <binding name="SecureBinding">
          <textMessageEncoding messageVersion="Soap12WSAddressing10" />
          <httpsTransport maxBufferSize="2147483647"
                          maxReceivedMessageSize="2147483647" />
        </binding>
      </customBinding>
    </bindings>
    <client>
      <endpoint address="/services/DefaultService.svc"
                binding="basicHttpBinding"
                bindingConfiguration="DefaultBinding"
                contract="OurNamespace.IOurContractAsync"
                name="DefaultEndpoint" />
      <endpoint address="/services/DefaultService.svc"
                binding="customBinding"
                bindingConfiguration="SecureBinding"
                contract="OurNamespace.IOurContractAsync"
                name="SecureEndpoint" />
    </client>
  </system.serviceModel>
</configuration>

При инициализации мы читаем свойство App.Current.Host.Source.Scheme.Клиент службы генерируется ChannelFactory, код похож на этот фрагмент:

protected string EndpointName {
  get {
    return (App.Current.Host.Source.Scheme == "https") ?
      "SecureEndpoint" : "DefaultEndpoint";
  }
}

protected IOurContractAsync CreateInterface() {
  var channelFactory = ChannelFactory<IOurContractAsync>(EndpointName);
  return channelFactory.CreateChannel();
}

Надеюсь, это поможет!

С уважением, Томас

1 голос
/ 21 января 2011

Я думаю, что существует несколько способов предоставления initparams для приложения SL со своих веб-страниц, таких как

param name = "initParams" value = "Https = true"

для страницы https и false для html-страницы. разбери это внутри SL и установить режим безопасности для конечная точка.

Вы можете программно создавать / редактировать прокси конечной точки в своем приложении SL.

Другим способом может быть настройка поведения транспорта на основе ссылки внутри SL-приложения без initparams (если начинается с https -> transport else none). Я считаю, что после загрузки sl-приложения ссылка должна быть не относительной, и это должно быть работающим решением.

Вы можете создать фабричный метод для создания прокси-сервера службы и поместить в него эту логику прокси-сервера настройки, что будет проще, чем полное удаление этого файла serviceconfig.

Вы бы просто позвонили

MyServiceClient client = Factory.MakeClient() 

и я думаю, что это достаточно элегантное решение. в MakeClient вы решаете, какую транспортную безопасность использовать и как это сделать.

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