Как настроить службу WCF в IIS7: HTTPS, сеансы, wsHttpBinding (SOAP)

Ситуация:

  1. У нас есть веб-сервер Windows 2008 с IIS7, (.NET4)
  2. Мы можем связываться с веб-сервером только через порт HTTPS (443) по умолчанию.
  3. На серверах размещен сайт ASP.NET, сервис является частью кода сайта.
  4. Некоторые клиенты (настольные приложения с поддержкой WCF) хотят взаимодействовать с нашим новым веб-сервисом WCF.
  5. Размер сообщения между сторонами может составлять 100 - 400 кб.
  6. Мы хотели бы сохранить часть службы WCF в IIS.
  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?


person smcoder    schedule 17.06.2010    source источник


Ответы (2)


  1. wsHttpBinding, оставайтесь с http и безопасностью, а IIS будет управлять жизненным циклом службы. Кроме того, вам может потребоваться выделенный пул приложений.
  2. Использование Session или нет - вопрос дизайна. Используйте сеансы, если между вызовами необходимо поддерживать состояние, в противном случае используйте для каждого вызова. Для операции ping не требуются сеансы.

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

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

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

person maxbeaudoin    schedule 17.06.2010
comment
Спасибо! 1. Да, у меня была такая же идея о пуле приложений. Итак, специальное приложение под основным сайтом. 2. Итак, сеансы ... Было бы хорошо иметь их, потому что несколько разных запросов нуждаются в аутентификации. И когда сессия жива, мне не нужно каждый раз обращаться к БД. Так что вопрос все же остается - вторую привязку DefaultSOAPBasedHTTPS можно упростить? С хостингом IIS: какой эффект имеет конфигурация ‹transport clientCredentialType = Basic /›? - person smcoder; 17.06.2010
comment
Только вы знаете, лучше ли иметь доступ к базе данных или экземпляру для управления ресурсами, но сеансами нужно управлять ... Я бы не стал их использовать на вашем месте. Кстати, аутентификация по-прежнему возможна без сеанса. - person maxbeaudoin; 17.06.2010

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

Ответ Бо очень помог, однако отсутствующим элементом был настраиваемый валидатор имени и пароля: 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>
person smcoder    schedule 19.06.2010