WCF wsHttpBinding 'algorithmSuite' не может быть проанализирован, ошибка

Я использую VSTS 2008 + C # + .Net 3.0. Я использую автономный WCF. При выполнении следующего оператора (host.Open ()) возникает следующая ошибка привязки не найдена. Я опубликовал весь свой файл app.config, есть идеи, что не так?

ServiceHost host = new ServiceHost(typeof(MyWCFService));
host.Open();

Сообщение об ошибке,

Значение свойства algorithmSuite не может быть проанализировано. Ошибка: значение «Aes128» не является допустимым экземпляром типа «System.ServiceModel.Security.SecurityAlgorithmSuite».

РЕДАКТИРОВАТЬ1: Я изменил значение параметра костюма алгоритма на значение По умолчанию, но при выполнении Open () обнаружил новую ошибку, сообщение об ошибке, любые идеи, что не так,

Проверка привязки завершилась неудачно, поскольку WSHttpBinding не поддерживает надежные сеансы через транспортную безопасность (HTTPS). Не удалось открыть фабрику каналов или хост службы. Используйте защиту сообщений для безопасного и надежного обмена сообщениями через HTTP.

Полный app.config,

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="MyBinding"
            closeTimeout="00:00:10"
            openTimeout="00:00:20"
            receiveTimeout="00:00:30"
            sendTimeout="00:00:40"
            bypassProxyOnLocal="false"
            transactionFlow="false"
            hostNameComparisonMode="WeakWildcard"
            maxReceivedMessageSize="100000000"
            messageEncoding="Mtom"
            proxyAddress="http://foo/bar"
            textEncoding="utf-16"
            useDefaultWebProxy="false">
          <reliableSession 
               enabled="false" />
          <security mode="Transport">
            <transport clientCredentialType="Digest"
               proxyCredentialType="None"
               realm="someRealm" />
            <message clientCredentialType="Windows"
           negotiateServiceCredential="false"
           algorithmSuite="Default"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="MyWCFService"
                behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyBinding" contract="IMyService"/>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mexServiceBehavior">
          <serviceMetadata httpsGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>

заранее спасибо, Джордж


person George2    schedule 22.06.2009    source источник
comment
Джордж, могу я сделать здесь предложение, вместо того, чтобы пытаться отлаживать каждую итерацию, не могли бы вы опубликовать вопрос с подробным описанием того, чего вы пытаетесь достичь, и попросить подходящие конфигурации? Совершенно не ясно, что вы пытаетесь аутентифицировать / авторизовать / защитить.   -  person blowdart    schedule 22.06.2009
comment
Я просто хочу использовать wsHttpBinding для разработки службы, это так просто! Я использую встроенную систему безопасности Windows, поскольку нахожусь в домене Windows.   -  person George2    schedule 22.06.2009
comment
Если вы находитесь в домене Windows - почему бы не использовать netTcp? Быстрее, надежнее, лучше, меньше накладных расходов? :-)   -  person marc_s    schedule 22.06.2009
comment
Если вы хотите придерживаться wsHttp, я бы отключил настройки надежного сеанса и, вероятно, также отключил бы все настройки безопасности - пока вы находитесь внутри своей компании в домене Windows, вряд ли есть риск того, что посторонний подглянет за ваше служебное общение. Безопасность добавляет накладные расходы и сложность.   -  person marc_s    schedule 22.06.2009
comment
Отключите безопасность: ‹режим безопасности = Нет /› и покончим с этим! :)   -  person marc_s    schedule 22.06.2009
comment
Тогда надёжные сессии, вероятно, излишни :) Они в основном означают, что вещи будут приходить в определенном порядке, и вы попадете в MSMQ и другие забавные вещи. Кроме того, вы должны выбрать либо транспорт, либо аутентификацию сообщений, и то, и другое, мягко говоря, излишне! Если вам просто нужна аутентификация Windows в домене, вам не нужно беспокоиться об этом, если вы можете размещать в IIS - см. codeproject.com/KB/WCF/WCFBasicHttpBinding.aspx   -  person blowdart    schedule 22.06.2009
comment
Я не использую netTCP в коммерческих целях, мой босс хочет опубликовать в Интернете в будущем, чтобы мы разработали стандартный интерфейс веб-сервисов и контракт.   -  person George2    schedule 22.06.2009
comment
Да, @Marc, я пробовал ваши нижеуказанные привязки, не связанные с безопасностью. Но мне также нужно включить https. Я разместил все свои настройки привязки версии https в своем исходном сообщении, знаете ли вы, что не так и как исправить, чтобы он работал с https?   -  person George2    schedule 22.06.2009
comment
@blowdart, я не использую IIS, а сам хостинг. Мне не нужен надежный сеанс, и я его отключил. Мне нужны базовые функции безопасности, такие как https. Я опубликовал (обновил) все свои текущие настройки в своем исходном сообщении. У вас есть идеи, что не так и как исправить, чтобы он работал с https?   -  person George2    schedule 22.06.2009
comment
@ George2: вы всегда можете открыть две конечные точки - одну с netTCP для внутренней связи (быстро, надежно, без безопасности), а другую для интернет-пользователей, использующих https с wsHttpBinding.   -  person marc_s    schedule 22.06.2009
comment
Классная идея, еще один вопрос, как включить https (включить функцию безопасности) wshttpbinding, в то время как разрешить клиенту добавлять ссылку на службу?   -  person George2    schedule 22.06.2009


Ответы (2)


Вам также необходимо обновить поведение службы, если вы измените конечную точку MEX с http на https - вам необходимо включить параметр httpsGetEnabled (а не httpGetEnabled):

   <behaviors>
      <serviceBehaviors>
        <behavior name="mexServiceBehavior">
          <serviceMetadata httpsGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

ОБНОВЛЕНИЕ:
Джордж, ознакомьтесь с этим Ссылка MSDN - алгоритма Aes128 не существует - необходимо выбрать один из существующих.

ОБНОВЛЕНИЕ 2:

Можете ли вы попробовать этот конфиг - уменьшите до максимума! :-)

  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="MyBinding"
            maxReceivedMessageSize="100000000"
            messageEncoding="Mtom"
            proxyAddress="http://foo/bar"
            textEncoding="utf-16"
            useDefaultWebProxy="false">
          <reliableSession enabled="false" />
          <security mode="None" />
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service name="MyWCFService"
                behaviorConfiguration="mexServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:9090/MyService"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyBinding" contract="IMyService"/>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mexServiceBehavior">
          <serviceMetadata httpsGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Можете ли вы запустить свою службу и добавить ссылку на службу из Visual Studio?

ОБНОВЛЕНИЕ 3.
Джордж, я бы порекомендовал вам взглянуть на эти ссылки, связанные с безопасностью, и почувствовать, что вам действительно нужно и чего вы хотите - и как этого добиться.

Марк

person marc_s    schedule 22.06.2009
comment
Спасибо, Марк, у меня возникла ошибка. Невозможно проанализировать значение свойства algorithmSuite. Ошибка: значение «Aes128» не является допустимым экземпляром типа «System.ServiceModel.Security.SecurityAlgorithmSuite». Любые идеи? Я создаю WCF на .Net 3.0, а не на .Net 3.5. - person George2; 22.06.2009
comment
Спасибо, Марк, я изменил значение конфигурации на Default, и такой ошибки нет, но я столкнулся с новой ошибкой, пожалуйста, обратитесь к разделу EDIT1 моего исходного сообщения. Есть идеи, что не так? - person George2; 22.06.2009
comment
Я думаю, что ссылка MSDN, о которой вы говорите, более точна, документ MSDN, на который я ссылаюсь, и вы можете видеть, что aes128 указан в образце, я удивлен, увидев противоречие между двумя документами MSDN. Вы думаете, что приведенный ниже документ MSDN неверен? msdn.microsoft.com/en-us/library/ms731299 (VS.85) .aspx - person George2; 22.06.2009
comment
Сообщение об ошибке сообщает вам, что случилось - вы не можете включить надежный обмен сообщениями через транспортную безопасность; вам нужно отключить надежный обмен сообщениями (‹надежный сеанс включен = false /›) - person marc_s; 22.06.2009
comment
Спасибо, Марк, ваше решение работает, но когда я использую «Добавить ссылку на службу» от клиента, клиент не может найти службу. Я использую адрес localhost: 9090 / MyService для добавления ссылки на службу. Есть идеи, что не так? - person George2; 22.06.2009
comment
Я обновил свой app.config, чтобы отключить надежный сеанс. Вы можете увидеть мою обновленную конфигурацию в моем исходном сообщении. Текущая проблема заключается в том, что я не могу добавить ссылку на службу от клиента, использующего адрес localhost: 9090 / MyService. Есть идеи, что не так? - person George2; 22.06.2009
comment
Вы изменили поведение службы для поддержки httpsGetEnabled ?? - person marc_s; 22.06.2009
comment
@marc_s, 1. Я пробовал работать с вашим опубликованным кодом (могу добавить ссылку на сервис со стороны клиента), я видел, как вы отключили все параметры безопасности в привязке, означает ли это, что если мы используем https, мы не можем поддерживать интерфейс mex? 2. Да, я изменил поведение службы для поддержки httpsGetEnabled, но не работает. Мне любопытно узнать, почему это не работает, и я хочу, чтобы он работал в среде https, поскольку мне нужно опубликовать свой сервис в интернет-среде. Любые идеи, что не так с моей конфигурацией (вы можете увидеть мои конфигурации в моем исходном сообщении). - person George2; 22.06.2009
comment
Итак, конфигурация без защиты работает - теперь вы можете пошагово начать добавлять функции защиты и посмотреть, что работает, а что нет :-) - person marc_s; 22.06.2009
comment
Если вы развертываете сценарий в Интернете, встроенная система безопасности Windows больше не будет работать. Как вы планируете обеспечивать безопасность? Транспортный уровень или уровень сообщений? Вы хотите использовать схему имени пользователя / пароля или какую-либо форму сертификатов? Вам нужно знать, что вы хотите / нужно - тогда мы сможем найти конфигурацию, которая подходит для этого требования. - person marc_s; 22.06.2009
comment
@marc_s, я хочу использовать транспортный уровень (https) при выходе в Интернет. Я хочу зашифровать транспортное сообщение, чтобы обеспечить доставку конфиденциального сообщения. Я хочу узнать от вас, можно ли включить https (выход в Интернет) при включении mex (разрешить клиенту добавлять ссылку на службу)? - person George2; 22.06.2009
comment
вы смешиваете здесь несколько вещей - либо у вас есть безопасность на уровне ТРАНСПОРТА, либо у вас есть безопасность на уровне СООБЩЕНИЯ; один или другой. Ознакомьтесь с новыми ссылками, связанными с безопасностью, которые я предоставил. Вы определенно должны иметь возможность защитить свою службу с помощью https и по-прежнему иметь возможность добавлять ссылку на службу из Visual Studio! - person marc_s; 23.06.2009

Сообщение об ошибке правильное, вы не получаете надежных сообщений через WSHttp, вам нужно использовать настраиваемая привязка и протокол.

person blowdart    schedule 22.06.2009
comment
Вы хотите объяснить, чего именно вы пытаетесь достичь - действительно похоже, что вы включаете и выключаете вещи наугад (не критика, я тоже!), Поэтому трудно понять, что предложить! - person blowdart; 22.06.2009
comment
Спасибо! Я просто хочу использовать wsHttpBinding для разработки службы, это так просто! :-) Я отключил надежный сеанс в app.config, вы можете увидеть мою обновленную конфигурацию. Но когда я использую «Добавить ссылку на службу» от клиента, клиент не может найти службу. Я использую адрес localhost: 9090 / MyService для добавления ссылки на службу. Есть идеи, что не так? - person George2; 22.06.2009
comment
Я прочитал ваш рекомендуемый документ. Надежный сеанс не нужен. Текущая проблема: я не могу добавить ссылку на службу со стороны клиента, есть идеи, что не так? - person George2; 22.06.2009
comment
Возможно, слишком просто: служба должна быть запущена, чтобы мастер добавления ссылки на службу нашел ее. - person Dabblernl; 22.06.2009
comment
Моя служба определенно работает, вот код, который я использовал для самостоятельного размещения службы. Если я не нажимал ни одной клавиши, служба запущена, ServiceHost host = new ServiceHost (typeof (MyWCFService)); host.Open (); Console.Read (); host.Close (); - person George2; 22.06.2009