WCF: использование потоковой передачи и аутентификации по имени пользователя и паролю одновременно - PullRequest
1 голос
/ 02 марта 2010

У меня есть служба WCF со следующими требованиями: а) Клиент запрашивает файл с сервера, который передается в виде потока. Файлы могут быть 100 МБ или больше. Мне нужно потоковое или чакирование или что-то еще, чтобы убедиться, что IIS не загружает весь пакет в память перед началом его отправки. б) Клиент передаст идентификатор для идентификации файла, который будет загружен. Пользователь должен пройти аутентификацию, указав имя пользователя / пароль. c) Хотя часть имени пользователя и пароля сообщения должна быть зашифрована, шифрование загруженного файла является необязательным для нашего варианта использования.

В других моих службах, куда я возвращаю файлы меньшего размера, я использую следующую привязку:

<ws2007HttpBinding>
    <binding name="ws2007HttpExtern" maxReceivedMessageSize="65536000">
      <security mode="Message">
        <message clientCredentialType="UserName" />
      </security>
    </binding>        
  </ws2007HttpBinding>

Но, как я уже сказал, это плохо для потоковой передачи (для шифрования сообщений требуется шифрование всего сообщения, а при потоковой передаче это не так).

Итак, я обратился в службу поддержки Microsoft и получил более или менее следующее предложение:

<bindings>
  <basicHttpBinding>
    <binding name="basicStreaming" 
      messageEncoding="Mtom" transferMode="StreamedResponse">
      <security mode="Transport">
        <transport clientCredentialType="Basic" />
      </security>
    </binding>
</bindings>

<services>
  <service behaviorConfiguration="MyProject.WCFInterface.DownloadBehavior"
    name="MyProject.WCFInterface.DownloadFile">
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicStreaming"
      contract="MyProject.WCFInterface.IDownloadFile" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>    
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="MyProject.WCFInterface.DownloadBehavior">
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Когда я использую это, я получаю следующее сообщение об ошибке:

Could not find a base address that matches scheme https for the endpoint with binding BasicHttpBinding. Registered base address schemes are [http].

Пока что я использую сервер веб-разработки (для производственной IIS7).

У меня есть два вопроса. а) Как бы вы настроили WCF для достижения цели? б) Если предложение MS хорошо: что я делаю неправильно, сообщение об ошибке мне не очень помогает.

Спасибо.

1 Ответ

0 голосов
/ 12 апреля 2010

Эта ошибка обычно связана с размещением служб WCF в IIS 7. WCF по умолчанию не поддерживается, поэтому здесь можно выполнить некоторые действия по устранению неполадок.

  1. Удалось ли вам разместить другие службы WCF на IIS 7? Возможно, вы захотите добавить функцию службы WAS на свой сервер IIS 7. Здесь - хороший учебник.

  2. Https требует, чтобы вы настроили IIS с надлежащим сертификатом SSL и добавили привязку HTTPS на ваш сайт. Здесь - это как.

Насколько я знаю, предложенное MS решение работает. Я использовал тот же подход, и он отлично работает.

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