Как настроить службу WCF в IIS7: HTTPS, Sessions, wsHttpBinding (SOAP) - PullRequest
0 голосов
/ 17 июня 2010

Ситуация:

  1. У нас есть веб-сервер Windows 2008 с IIS7, (.NET4)
  2. Мы можем общаться с веб-сервером только через порт HTTPS (443) по умолчанию
  3. На серверах размещен веб-сайт ASP.NET, служба является частью кода веб-сайта.
  4. Некоторые клиенты (настольные приложения с поддержкой WCF) хотят общаться с нашим новым веб-сервисом WCF
  5. Размер сообщения между сторонами может составлять 100 - 400 кбайт
  6. Мы хотели бы сохранить часть службы IIS для WCF.
  7. На стороне клиента мы запрашиваем пользовательское имя пользователя и пароль для подключения к нашему сервису
  8. Есть более длинные сессии с большим количеством обработчиков БД
  9. А есть короткие короткие сеансы - например, пинг от клиента
  10. Клиентские пароли хранятся на нашем веб-сервере (из БД) - клиенты должны проходить проверку подлинности на основе этих паролей.

Вопрос
1. Из этих ограничений какой протокол лучше всего использовать?
2. Будете ли вы использовать сеансы по умолчанию?
3. Сначала опробовал эту привязку (она работает, но не поддерживает сессию)

  <!--define a SOAP binding-->
  <wsHttpBinding>
    <binding name="DefaultSOAPBasedHTTPSBinding" maxReceivedMessageSize="400000">
      <readerQuotas maxArrayLength="102400" />
      <security mode="Transport">
        <transport clientCredentialType="None" />
      </security>
    </binding>
  </wsHttpBinding>

Чтобы включить сеансы:

  <wsHttpBinding>
    <binding name="DefaultSOAPBasedHTTPSBinding" maxReceivedMessageSize="400000">          
      <readerQuotas maxArrayLength="102400" />
      <reliableSession enabled="true" />
      <security mode="TransportWithMessageCredential">
        <transport clientCredentialType="Basic" />
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </wsHttpBinding>

Мне кажется, что этот транспорт и безопасность сообщений слишком велики - я имею в виду, действительно ли нам это нужно для того, чтобы разрешать сеансы с wsHttpBinding?

Ответы [ 2 ]

0 голосов
/ 19 июня 2010

Итак, наконец, я использую Session, потому что он не слишком сильно влияет на производительность. И это было также ограничением, что мы должны знать, как разговаривает с нами через веб-сервис. Итак, нам нужна аутентификация.

Ответ Бода очень помог, однако отсутствующим элементом были пользовательские имя и пароль, которые проверяют правильность: http://msdn.microsoft.com/en-us/library/aa702565.aspx

С этим web.config:

        <wsHttpBinding>
            <binding name="DefaultSOAPBasedHTTPSBinding" maxReceivedMessageSize="400000">
                <readerQuotas maxArrayLength="102400"/>
                <reliableSession enabled="true"/>
                <security mode="TransportWithMessageCredential">
                    <transport clientCredentialType="Basic"/>
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </wsHttpBinding>

Может быть, это кому-нибудь поможет ...

И трассировка WCF также очень помогает при обнаружении следующих магических проблем конфигурации WCF:

<system.diagnostics>
    <trace autoflush="true"/>
    <sources>
        <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
            <listeners>
                <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="SdrConfigExample.e2e"/>
            </listeners>
        </source>
    </sources>
</system.diagnostics>
0 голосов
/ 17 июня 2010
  1. wsHttpBinding, оставайтесь с http и безопасностью, и IIS будет управлять жизненным циклом службы. Также вам может потребоваться выделенный пул приложений.
  2. Использование сессии или нет - это вопрос дизайна. Используйте сеансы, если между вызовами есть состояние, которое необходимо поддерживать, в противном случае используйте для каждого вызова. Операция ping не требует сеансов.

Я предлагаю следующую конфигурацию привязки вместе с каждым вызовом:

  <wsHttpBinding>
    <binding name="DefaultSOAPBasedHTTPSBinding" maxReceivedMessageSize="400000">          
      <readerQuotas maxArrayLength="102400" />
      <security>
        <message clientCredentialType="Username"/>
      </security>
    </binding>
  </wsHttpBinding>

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

...