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

时间:2015-06-22 09:15:12

标签: c# wcf

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

我尝试上传WCF文件,但没有上传大文件

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

我的项目由3部分构成:

  1. WCF服务

  2. 使用服务的用户控件

  3. 使用用户控件的网站

  4. 这是我的服务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>
    

    这是我的用户控件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>
    

    这是我的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>
    

    以下是我实施参考呼叫的方式:

    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();
                    }
        }
    } 
    

    我有什么遗失的吗?

2 个答案:

答案 0 :(得分:2)

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

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>

客户端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>

我希望它能节省我用来解决它的其他时间: - )

答案 1 :(得分:1)

使用IIS服务器上传大文件时遇到了同样的问题。

我发现有两个地方需要修改web.config

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

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="50000000" />    <!-- Allow files of upto 50,000,000 bytes (about 50Mb) to be uploaded --> 
    </requestFiltering>
  </security>
</system.webServer>

希望这有帮助。

此处有更多详情: Upload large files