为什么在将文件字节流发送到WCF服务时出现“401-Unauthorized”错误?

时间:2012-05-11 16:05:04

标签: c# wcf silverlight iis-7

我有一个WCF服务,在II7上托管的basicHttp绑定是从Silverlight客户端调用的。我可以毫无问题地调用端点上的所有服务 除了一个。

我正在尝试上传文件,以便服务接收字节数组。如果我上传超过3MB的文件,我会收到以下错误。

当我尝试调用此服务时:

[OperationContract]
public AuditResponse UploadVendorAuditFile( int vendorID, 
                                            int sourceSystemID, 
                                            string fileName,
                                            byte[] fileBytes )
{
    // stuff
}

我收到以下错误:

  

401 - 未经授权:由于凭据无效,访问被拒绝。您   没有权限使用。查看此目录或页面   您提供的凭据。

以下是我的配置。

端点绑定

<basicHttpBinding>
  <binding 
    name="basicHttpBindingConfiguration" 
    maxBufferSize="2147483647"
    maxBufferPoolSize="2147483647" 
    maxReceivedMessageSize="2147483647"
    >
    <readerQuotas 
    maxDepth="2147483647" 
    maxStringContentLength="2147483647"
    maxArrayLength="2147483647" 
    maxBytesPerRead="2147483647" 
    maxNameTableCharCount="2147483647" 
    />
    <security mode="TransportCredentialOnly">
    <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
    </security>
  </binding>
</basicHttpBinding>

服务配置

<behaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
  </serviceBehaviors>
</behaviors>

客户端

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding 
              name="BasicHttpBinding_WMService" 
              maxBufferSize="2147483647"
              maxReceivedMessageSize="2147483647"
              >
                <security mode="TransportCredentialOnly" />
            </binding>
        </basicHttpBinding>
    </bindings>

2 个答案:

答案 0 :(得分:1)

它失败的文件大小是否大于1MB左右?尝试启用tracing以了解错误的实际原因。

如果文件的大小较大,则可能是因为读取器配额设置需要在服务器端和客户端

上设置较大值

另外考虑在serviceBehaviour中添加maxItemsInObjectGraph,如图所示

 <serviceBehaviors>        
    <behavior>
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>

注意:确保在客户端和服务器端具有相同的readerQuotas设置

还尝试在web.config中设置以下设置

<system.web>  
     <httpRuntime maxRequestLength ="32768"/>
  </system.web>  

答案 1 :(得分:0)

确保在WCF服务的绑定中设置最大邮件大小..

例如:

<binding name="xxx" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
  <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="50000000" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>