WCF文件上载大文件

WCF文件上载大文件,wcf,Wcf,在过去的两天里,我一直在做一些研究,以找到解决我问题的方法,但都没有用 我创建了一个WCF服务,如下所示: [OperationContract] void CopyMemberFile(string memberNumber, string fileName, byte[] fileBytes); 我从客户端调用它,就像从页面加载事件调用它一样: byte[] filebytes = null; using (Stream fs = new FileStream(file, FileMod

在过去的两天里,我一直在做一些研究,以找到解决我问题的方法,但都没有用

我创建了一个WCF服务,如下所示:

[OperationContract]
void CopyMemberFile(string memberNumber, string fileName, byte[] fileBytes);
我从客户端调用它,就像从页面加载事件调用它一样:

byte[] filebytes = null;

using (Stream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
     filebytes = new byte[fs.Length];
     fs.Read(filebytes, (int)0, (int)fs.Length);
}

client.CopyMemberFile(memberNumber, Path.GetFileName(file), filebytes);
我的配置如下:

客户端配置:

<configuration>
  <system.web>
    <authorization>
      <allow users="*"/>
    </authorization>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
        <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
        <add assembly="System.Speech, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>
    </compilation>
    <authentication mode="Forms">
    <forms loginUrl="~/Account/Login.aspx" timeout="300" cookieless="UseUri" />
  </authentication>
  <membership>
    <providers>
      <clear />
        <add name="AspNetSqlMembershipProvider"
             type="System.Web.Security.SqlMembershipProvider" 
             connectionStringName="ApplicationServices" 
             enablePasswordRetrieval="false" 
             enablePasswordReset="true" 
             requiresQuestionAndAnswer="false" 
             requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" 
             minRequiredPasswordLength="6" 
             minRequiredNonalphanumericCharacters="0" 
             passwordAttemptWindow="10" 
             applicationName="/" />
    </providers>
  </membership>
  <profile>
    <properties>
      <add name="FirstName"/>
      <add name="LastName"/>
      <add name="MemberNumber"/>
      <add name="LastVisit" type="System.DateTime"/>
    </properties>
    <providers>
      <clear />
        <add name="AspNetSqlProfileProvider" 
             type="System.Web.Profile.SqlProfileProvider"
             connectionStringName="ApplicationServices" 
             applicationName="/" />
    </providers>
  </profile>
  <roleManager enabled="false">
    <providers>
      <clear />
        <add name="AspNetSqlRoleProvider" 
             type="System.Web.Security.SqlRoleProvider" 
             connectionStringName="ApplicationServices" 
             applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider"
             type="System.Web.Security.WindowsTokenRoleProvider" 
             applicationName="/" />
    </providers>
  </roleManager>
  <httpHandlers>
    <remove verb="*" path="*.asmx"/>
    <add verb="*" path="*.asmx" validate="false" 
         type="System.Web.Script.Services.ScriptHandlerFactory" />
    <add path="Telerik.Web.UI.WebResource.axd" 
         type="Telerik.Web.UI.WebResource" verb="*" validate="false" />
  </httpHandlers>
  <httpRuntime maxRequestLength="1048576"/>
</system.web>
<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="online.members.asp.Services.MembersOnlineSeviceAjaxAspNetAjaxBehavior">
        <enableWebScript />
      </behavior>
    </endpointBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                             multipleSiteBindingsEnabled="true" />
  <services>
    <service name="online.members.asp.Services.MembersOnlineSeviceAjax">
      <endpoint address="" behaviorConfiguration="online.members.asp.Services.MembersOnlineSeviceAjaxAspNetAjaxBehavior"
                binding="webHttpBinding" 
                contract="online.members.asp.Services.MembersOnlineSeviceAjax" />
    </service>
  </services>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IMembershipApplications" 
                     closeTimeout="00:01:00"
                     openTimeout="00:01:00" 
                     receiveTimeout="00:10:00" 
                     sendTimeout="00:01:00"
                     allowCookies="false" 
                     bypassProxyOnLocal="false" 
                     hostNameComparisonMode="StrongWildcard"
                     maxBufferSize="2147483647" 
                     maxBufferPoolSize="2147483647" 
                     maxReceivedMessageSize="2147483647"
                     messageEncoding="Text" 
                     textEncoding="utf-8" 
                     transferMode="Buffered"
                     useDefaultWebProxy="true">
        <readerQuotas maxDepth="128" 
                      maxStringContentLength="2147483647" 
                      maxArrayLength="2147483647"
                      maxBytesPerRead="2147483647" 
                      maxNameTableCharCount="2147483647" />
        <security mode="None">
          <transport clientCredentialType="None" 
                     proxyCredentialType="None"
                     realm="" />
          <message clientCredentialType="UserName" 
                   algorithmSuite="Default" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>
  <client>
    <endpoint address="http://localhost:58119/MembershipApplications.svc"
              binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_IMembershipApplications"
              contract="MembershipApplicationsServiceReference.IMembershipApplications"
              name="BasicHttpBinding_IMembershipApplications" />
  </client>
</system.serviceModel>
我只能上传几个KB的文件,但任何超过8KB的文件都会失败

任何帮助都会很棒

呼叫代码:

protected void Page_Load(object sender, EventArgs e)
{
    var file = Request.Form["name"];            
    var memberNumber = Request.Form["memberNumber"];
    var tempId = Guid.NewGuid();

    var client = new MembershipApplicationsServiceReference.MembershipApplicationsClient();

    client.LogEvent("Entered Upload.aspx");

    try
    {
        byte[] filebytes = null;

        using (Stream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
        {
            filebytes = new byte[fs.Length];
            fs.Read(filebytes, (int)0, (int)fs.Length);

            client.LogEvent("Starting service call from Upload.aspx");
            client.CopyMemberFile(memberNumber, Path.GetFileName(file), filebytes);                    
        }

        client.LogEvent("Completed service call from Upload.aspx");
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.StackTrace);

        client.LogEvent("Upload.aspx Error: " + ex.Message + ex.StackTrace);

        StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message;
    }
    finally
    {
        client.LogEvent("Finishing up");
    }
}

查看服务的配置文件,您使用的是.NET 4.0,没有指定任何绑定,因此您将收到
basicHttpBinding
的默认设置。如上面评论中所建议的,按如下方式更新服务的配置文件:

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IMembershipApplications" 
                     closeTimeout="00:01:00"
                     openTimeout="00:01:00" 
                     receiveTimeout="00:10:00" 
                     sendTimeout="00:01:00"
                     allowCookies="false" 
                     bypassProxyOnLocal="false" 
                     hostNameComparisonMode="StrongWildcard"
                     maxBufferSize="2147483647" 
                     maxBufferPoolSize="2147483647" 
                     maxReceivedMessageSize="2147483647"
                     messageEncoding="Text" 
                     textEncoding="utf-8" 
                     transferMode="Buffered"
                     useDefaultWebProxy="true">
        <readerQuotas maxDepth="128" 
                      maxStringContentLength="2147483647" 
                      maxArrayLength="2147483647"
                      maxBytesPerRead="2147483647" 
                      maxNameTableCharCount="2147483647" />
        <security mode="None">
          <transport clientCredentialType="None" 
                     proxyCredentialType="None"
                     realm="" />
          <message clientCredentialType="UserName" 
                   algorithmSuite="Default" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>
  <services>
    <service name="YourServiceName">
      <endpoint address="" 
                binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IMembershipApplications" 
                contract="YourFullyQualifiedContractName" />
    </service>
  </services>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

这将告诉WCF将您的设置用于
basicHttpBinding
,而不是.NET默认设置

或者,您可以省略绑定定义上的
name
属性,WCF将使用它作为配置文件处理的所有服务的默认绑定(如果您有多个)


如果这没有帮助,或者如果您现在遇到了不同的错误,请告诉我们,我们将从中解决。

消息是-格式化程序在尝试反序列化消息时引发了异常:反序列化操作“CopyMemberFile”的请求消息体时出错。读取XML数据时已超过最大数组长度配额(16384)。可以通过更改创建XML读取器时使用的XmlDictionaryReaderQuotas对象的MaxArrayLength属性来增加此配额。第1行,位置45385。您可以发布您的服务和客户端配置文件的完整服务模型部分吗?听起来您的客户机使用的是默认限制(几K)。此外,您可能希望查看大文件的WCF流。请在问题中通过您的客户端web.config-代码和XML在注释中显示不好:)刚刚添加,需要一些时间才能使用。您的第一句话提示我,我缺少服务器端配置,因此默认为标准配置?
protected void Page_Load(object sender, EventArgs e)
{
    var file = Request.Form["name"];            
    var memberNumber = Request.Form["memberNumber"];
    var tempId = Guid.NewGuid();

    var client = new MembershipApplicationsServiceReference.MembershipApplicationsClient();

    client.LogEvent("Entered Upload.aspx");

    try
    {
        byte[] filebytes = null;

        using (Stream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
        {
            filebytes = new byte[fs.Length];
            fs.Read(filebytes, (int)0, (int)fs.Length);

            client.LogEvent("Starting service call from Upload.aspx");
            client.CopyMemberFile(memberNumber, Path.GetFileName(file), filebytes);                    
        }

        client.LogEvent("Completed service call from Upload.aspx");
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.StackTrace);

        client.LogEvent("Upload.aspx Error: " + ex.Message + ex.StackTrace);

        StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message;
    }
    finally
    {
        client.LogEvent("Finishing up");
    }
}
<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IMembershipApplications" 
                     closeTimeout="00:01:00"
                     openTimeout="00:01:00" 
                     receiveTimeout="00:10:00" 
                     sendTimeout="00:01:00"
                     allowCookies="false" 
                     bypassProxyOnLocal="false" 
                     hostNameComparisonMode="StrongWildcard"
                     maxBufferSize="2147483647" 
                     maxBufferPoolSize="2147483647" 
                     maxReceivedMessageSize="2147483647"
                     messageEncoding="Text" 
                     textEncoding="utf-8" 
                     transferMode="Buffered"
                     useDefaultWebProxy="true">
        <readerQuotas maxDepth="128" 
                      maxStringContentLength="2147483647" 
                      maxArrayLength="2147483647"
                      maxBytesPerRead="2147483647" 
                      maxNameTableCharCount="2147483647" />
        <security mode="None">
          <transport clientCredentialType="None" 
                     proxyCredentialType="None"
                     realm="" />
          <message clientCredentialType="UserName" 
                   algorithmSuite="Default" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>
  <services>
    <service name="YourServiceName">
      <endpoint address="" 
                binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IMembershipApplications" 
                contract="YourFullyQualifiedContractName" />
    </service>
  </services>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>