Как включить потоковую передачу с помощью службы WCF в Azure с помощью членства / авторизации? - PullRequest
1 голос
/ 18 февраля 2011

Я врезался в стену и уже довольно давно тяну за волосы.По сути, мне нужно создать службу WCF, которая будет иметь поставщиков членства и авторизации ASP.NET, однако она должна разрешать передачу массивов byte [] или потоковых объектов и сохранять их в Azure.Сам сервис размещен на Azure.

Проблема, с которой я столкнулся, заключается в том, что WCF хочет обеспечить безопасность на уровне сообщений для обмена учетными данными клиента.Итак, у меня была следующая конфигурация, которая работает довольно хорошо:

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="DefaultServiceBehavior">
        <serviceMetadata httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
        <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider" />
          <serviceCredentials>
            <serviceCertificate x509FindType="FindBySubjectName" storeName="My" storeLocation="LocalMachine" findValue="SecureChannelCertificate" />
            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"  membershipProviderName="SqlMembershipProvider" />
         </serviceCredentials>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <wsHttpBinding>
      <binding name="SecureBinding" messageEncoding="Mtom">
        <security mode="Message">
          <message clientCredentialType="UserName" negotiateServiceCredential="true" establishSecurityContext="true" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
</system.serviceModel>

Итак, требования изменились, и теперь я должен отправить файлы в Azure через службу WCF.Неважно, что я делаю, WCF кричит на меня со всеми видами ошибок.

Кто-нибудь знает, как настроить службу так, чтобы она могла использовать аутентификацию / авторизацию, а также потоковую передачу?

Спасибо!

1 Ответ

6 голосов
/ 24 февраля 2011

Хотя предоставленной вами информации недостаточно для определения проблемы, я думаю, что причина получения ошибок связана с ограничениями размера сообщений WCF по умолчанию, такими как сообщение, содержимое и длина массива.

Значения по умолчанию для этих настроек слишком малы (64 КБ для maxReceivedMessageSize, 16 КБ для maxArrayLength и 8 КБ для maxStringContentLength) для передачи больших данных через WCF и должны быть увеличены, чтобы иметь возможность обрабатывать сообщения или байтовые массивы, которые содержат большие данные,Вы можете изменить эти значения по умолчанию, используя элементы readerQuotas и wsHttpBinding / binding .

Вот пример настроек, основанных на вашем файле конфигурации, чтобы разрешить сообщение объемом до 4 МБ, передача строки и байтового массива.

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="DefaultServiceBehavior">
        <serviceMetadata httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
        <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider" />
          <serviceCredentials>
            <serviceCertificate x509FindType="FindBySubjectName" storeName="My" storeLocation="LocalMachine" findValue="SecureChannelCertificate" />
            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"  membershipProviderName="SqlMembershipProvider" />
         </serviceCredentials>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <wsHttpBinding>
      <binding name="SecureBinding" messageEncoding="Mtom" maxReceivedMessageSize="4194304">
<readerQuotas maxStringContentLength="4194304" maxArrayLength="4194304"/>
        <security mode="Message">
          <message clientCredentialType="UserName" negotiateServiceCredential="true" establishSecurityContext="true" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
</system.serviceModel>
...