为什么在将文件字节流发送到 WCF 服务时收到“401 - 未经授权”错误

本文关键字:错误 授权 服务 文件 字节流 为什么 WCF | 更新日期: 2023-09-27 18:33:50

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

我正在尝试上传文件,以便服务接收字节数组。 如果我上传的文件超过 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>

为什么在将文件字节流发送到 WCF 服务时收到“401 - 未经授权”错误

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

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

还可以考虑在服务中添加 maxItemsInObjectGraph 的行为,如图所示

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

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

同时尝试在您的 web.config 中设置以下设置

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

请确保在 WCF 服务的绑定中设置最大消息大小。

例如:

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