use*_*186 21 .net c# asp.net wcf basichttpbinding
我正在尝试构建一个WCF服务,允许我从客户端向服务发送大型二进制文件.
但是我只能成功传输高达3-4MB的文件.(当我尝试转移4.91MB时,我失败了,当然,除了之外)
如果我尝试发送4.91MB文件,我得到的错误是:
异常消息:接收到http:// localhost:56198/Service.svc的HTTP响应时发生错误.这可能是由于服务端点绑定不使用HTTP协议.这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭).请参阅服务器日志以获取更多详
内部异常消息:基础连接已关闭:接收上发生意外错误.
内部异常消息:无法从传输连接读取数据:远程主机强制关闭现有连接.
内部异常消息:远程主机强制关闭现有连接
一旦将byte []文件作为方法参数发送到公开的服务方法,就会在客户端发生此错误.
我在服务方法的第一行有一个断点,如果文件传输成功(低于3MB),则会触发断点并传输文件.但是在这种情况下,只要调用该方法,就会出现错误.如果出现此错误,则不会触发服务中的断点.
我将粘贴我的Service Web.config和Asp Page(Client)Web.config的各个部分.如果您还需要发送文件并接受文件的代码,请告诉我,我也会发送该文件.
服务Web.Config
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttpEndpointBinding" closeTimeout="01:01:00"
openTimeout="01:01:00" receiveTimeout="01:10:00" sendTimeout="01:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646"
messageEncoding="Mtom" textEncoding="utf-8" transferMode="StreamedRequest"
useDefaultWebProxy="true">
<readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646" maxArrayLength="2147483646"
maxBytesPerRead="2147483646" maxNameTableCharCount="2147483646" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="DragDrop.Service.ServiceBehavior" name="DragDrop.Service.Service">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpEndpointBinding" contract="DragDrop.Service.IService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DragDrop.Service.ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
客户端(Asp.net页面)Web.Config
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="2147483646" maxBufferPoolSize="2147483646" maxReceivedMessageSize="2147483646"
messageEncoding="Mtom" textEncoding="utf-8" transferMode="StreamedResponse"
useDefaultWebProxy="true">
<readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646" maxArrayLength="2147483646"
maxBytesPerRead="2147483646" maxNameTableCharCount="2147483646" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="">
<extendedProtectionPolicy policyEnforcement="Never" />
</transport>
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="debuggingBehaviour">
<dataContractSerializer maxItemsInObjectGraph="2147483646" />
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="http://localhost:56198/Service.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference.IService"
name="BasicHttpBinding_IService" behaviorConfiguration="debuggingBehaviour" />
</client>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
Tho*_*rin 17
(虽然我同意流媒体转移是可取的,但下面的内容应该可以使其无需任何其他更改)
您还需要在Web.config中增加最大消息长度:
<configuration>
<system.web>
<httpRuntime maxMessageLength="409600"
executionTimeoutInSeconds="300"/>
</system.web>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这会将最大消息长度设置为400 MB(参数以kB为单位).有关更多信息,请查看此MSDN页面.
Jak*_*lås 16
正如所指出的,尝试使用Streaming Transfer,这里有一些示例代码,显示使用流传输发送和接收(可能)大量数据.
使用这样的绑定,注意MaxReceivedMessageSize和TranferMode设置.
<binding name="Streaming_Binding" maxReceivedMessageSize="67108864"
messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed">
</binding>
Run Code Online (Sandbox Code Playgroud)
添加一些服务代码:
[OperationContract]
public Stream GetLargeFile()
{
return new FileStream(path, FileMode.Open, FileAccess.Read);
}
[OperationContract]
public void SendLargeFile(Stream stream)
{
// Handle stream here - e.g. save to disk
ProcessTheStream(stream);
// Close the stream when done processing it
stream.Close();
}
Run Code Online (Sandbox Code Playgroud)
还有一些客户端代码:
public Stream GetLargeFile()
{
var client = /* create proxy here */;
try
{
var response = client.GetLargeFile();
// All communication is now handled by the stream,
// thus we can close the proxy at this point
client.Close();
return response;
}
catch (Exception)
{
client.Abort();
throw;
}
}
public void SendLargeFile(string path)
{
var client = /* create proxy here */;
client.SendLargeFile(new FileStream(path, FileMode.Open, FileAccess.Read));
}
Run Code Online (Sandbox Code Playgroud)
此外,请确保您没有超时,大文件可能需要一段时间才能传输(默认的receiveTimeout为10分钟).
您可以在此处下载Microsoft WCF/WF示例代码(在编写本文时,顶部C#链接已断开,但其他示例代码似乎没问题).
您是否看过使用流式传输?
Windows Communication Foundation (WCF) 可以使用缓冲或流式传输发送消息。在默认的缓冲传输模式下,消息必须在接收方读取之前完全传送。在流传输模式下,接收者可以在消息完全传递之前开始处理消息。当传递的信息很长并且可以串行处理时,流模式很有用。当消息太大而无法完全缓冲时,流模式也很有用。
http://msdn.microsoft.com/en-us/library/ms789010.aspx