如何为413请求实体太大错误配置WCF服务应用程序

时间:2014-06-20 21:27:08

标签: c# .net web-services wcf wcf-binding

我运行的WCF服务应用程序需要将字节数组发送到服务并从服务返回。我得到了413"请求太大"错误。我已经研究过这个错误,并且有许多响应,比如更改绑定元素以包含maxReceivedMessageSize,将readerQuotes元素添加到绑定元素中,并设置设置和其他更改。但是,我的web.config没有绑定元素。我在客户端改变了它,但这没有任何区别。这将使服务器端(服务运行)成为需要完成这些设置的地方。我无法在服务器端进行更改。我缺少哪些设置来处理发送和接收更大的字节数组?这是服务器正在使用的web.config:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

2 个答案:

答案 0 :(得分:1)

默认情况下,从WCF 4.0开始(没有明确定义端点或绑定)WCF将使用basicHttpBinding创建默认端点。这使得配置不那么混乱,但也意味着您获得绑定的默认值。当您需要绑定的非默认设置(在服务端)时,有两种方法可以解决此问题:

首先,您可以通过省略name属性来添加默认绑定配置,如下所示:

<system.serviceModel>
  <bindings>
    <basicHttpBinding>
      <binding closeTimeout="........... />
    </basicHttpBinding>
  </bindings>

或者,您可以命名绑定配置,然后创建使用该配置的显式端点:

<system.serviceModel>
  <services>
    <service name=".....>
      <endpoint address="" bindingConfiguration="MyBasicHttpBinding"..... />

第二个例子假设你有一个名为&#34; MyBasicHttpBinding&#34;的绑定配置。在你的绑定部分。

为了简单起见,我省略了大量的配置。如果您需要更多详细信息,请与我们联系。

答案 1 :(得分:0)

https://stackoverflow.com/a/884248/78551是此问题的可接受答案。服务器端将设置类似的配置。

由于试图从实体框架中撤回大量数据集,我曾遇到过这个问题。有一个限制,这些事情会严重影响您可以推动的数据量。

我打破了我的要求。 GetProducts,GetOrders,GetContracts等。然后在客户端我将它们拼接在一起。我不宽恕这样做但我被建筑师强迫处理这些巨大的数据集。

有时你无法绕过框架/平台的限制。

另外,您是否看过其他使用的协议,如net.tcp(如果我没记错的话)会打开套接字并传输数据?