WCF - 大文件上传 - (413) 请求实体太大

Lir*_*man 3 c# wcf

有人可以看看我的新代码吗?我现在被这个错误困了 3 天,这让我发疯了......

我正在尝试上传 WCF 文件,但未上传大文件

我收到此错误:“远程服务器返回了意外响应:(413) 请求实体太大。”

我的项目由 3 个部分构成:

  1. WCF服务

  2. 使用服务的用户控件

  3. 使用用户控件的网站

这是我的服务 we.config:

<system.serviceModel>

    <services>
      <service name="AttachmentService" behaviorConfiguration="">
        <endpoint name="DefaultEndPoint" address="http://localhost:54893/AttachmentService.svc"
                  behaviorConfiguration="EndpointBehaviors"
                  binding="wsHttpBinding" bindingName="AttachmentBinding"
                  contract="AttachmentsService.IAttachmentService"></endpoint>
      </service>
    </services>

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

      <endpointBehaviors>
        <behavior name="EndpointBehaviors">
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <bindings>
      <basicHttpBinding>
        <binding name="AttachmentBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" receiveTimeout="00:01:00" sendTimeout="00:01:00"
                 textEncoding="utf-8" openTimeout="00:01:00">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <security mode="None" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
  </system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

这是我的用户控件 app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IAttachmentService" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:54893/AttachmentService.svc"
          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAttachmentService"
          contract="AttachmentsService.IAttachmentService" name="BasicHttpBinding_IAttachmentService" />
    </client>
  </system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)

这是我的 UI web.config:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483647" />
      </requestFiltering>
    </security>
    <serverRuntime enabled="true" uploadReadAheadSize="2147483647" maxRequestEntityAllowed="2147483647" />
  </system.webServer>

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IAttachmentService" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:54893/AttachmentService.svc"
          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAttachmentService"
          contract="AttachmentsService.IAttachmentService" name="BasicHttpBinding_IAttachmentService" />
    </client>
  </system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

这是我实现参考调用的方式:

public void UploadFile(string serviceUrl,decimal maxFileSize, AttachmentFileParams fileParams, Stream file)
{
    AttachmentServiceClient client = null;
    try
    {
        if (file.Length > (maxFileSize * 1024)) //maxFileSize is defined in KB and file.Length is in Bytes
                    return Serialization.ConvertToJson(new { IsError = true, ErrorMessage = Constants.Messages.MaxFileSizeExceeded + maxFileSize });

                string requestUrl = string.Format("{0}/UploadFile", serviceUrl);
                string jsonFile = Serialization.ConvertToJson(fileParams);
                byte[] jsonFileBytes = Encoding.UTF8.GetBytes(jsonFile);
                byte[] len = BitConverter.GetBytes(jsonFileBytes.Length);

                using (client = new AttachmentServiceClient())
                {
                    client.UploadFile(file);
                }
    }
    catch (Exception ex)
    { }
    finally
    {
        try
                {
                    if (client.State != System.ServiceModel.CommunicationState.Closed)
                        client.Close();
                }
                catch
                {
                    client.Abort();
                }
    }
} 
Run Code Online (Sandbox Code Playgroud)

有什么我想念的吗?

Lir*_*man 5

好吧,我终于解决了它,这是对我有用的配置文件:

WCF 服务 web.config 文件:

    <?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="2147483647" />
  </system.web>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
      <!-- The name of the service -->
      <service name="WcfService1.Service1">
        <!--you can leave the address blank or specify your end point URI-->
        <endpoint binding="webHttpBinding" bindingConfiguration="higherMessageSize" contract="WcfService1.IService1" behaviorConfiguration="Web" />
      </service>
    </services>
    <bindings>
      <webHttpBinding>
        <!-- configure the maxReceivedMessageSize value to suit the max size of the request (in bytes) you want the service to receive-->
        <binding name="higherMessageSize" transferMode="Streamed" maxReceivedMessageSize="2147483647" />
      </webHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="Web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <!--<serviceHostingEnvironment multipleSiteBindingsEnabled="false" />-->
  </system.serviceModel>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

客户端 app.config/web.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="2147483647" />
  </system.web>

  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="BasicHttpBinding_IService1" maxReceivedMessageSize="2147483647" />
      </webHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:59540/Service1.svc" behaviorConfiguration="webhttp"
        binding="webHttpBinding" bindingConfiguration="BasicHttpBinding_IService1"
        contract="ServiceReference1.IService1" name="BasicHttpBinding_IService1" />
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webhttp">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我希望它能节省我花在解决它上的时间:-)