2011-02-17 75 views
1

我已经打了一堵墙,现在已经拉了很长时间了。基本上,我需要创建一个WCF服务,它具有ASP.NET Membership和Authorization提供程序,但它需要允许传输byte []数组或Stream对象并将它们保存到Azure。该服务本身托管在Azure上。如何使用Membership/Authorization在Azure上使用WCF服务启用流传输?

我遇到的问题是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> 

所以后来要求改变了,现在我需要将文件推通过WCF服务Azure上。无论我做什么,WCF都会以各种各样的错误尖叫我。

有谁知道如何配置服务,以便它可以使用认证/授权以及流?

谢谢!

+0

你能发布错误吗? – 2011-02-21 18:00:27

回答

6

尽管您提供的信息不足以确定问题,但我认为出现错误的原因是由于WCF默认消息大小限制(如消息,内容和阵列长度)所致。

这些设置的默认值太低(maxReceivedMessageSize为64K,maxArrayLength为16K,maxStringContentLength为8K)通过WCF传输大数据,应该增加以便能够处理包含较大数据的消息或字节数组。您可以使用readerQuotaswsHttpBinding/binding元素更改这些默认值。

下面是一个基于配置文件的示例设置,允许高达4MB的消息,字符串和字节数组传输。

<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> 
+0

嘿,非常感谢你 - 这真的有效!是啊:) :) :) – bleepzter 2011-02-24 18:00:54