我正在尝试构建一个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"/> …Run Code Online (Sandbox Code Playgroud) 如何以编程方式在app #config中创建app.config服务设置的以下部分:
<client>
<endpoint address="https://someServiceUrl"
binding="basicHttpBinding" bindingConfiguration="Contact"
contract="ServiceReference.PostingWebService" name="PostingWebServicePort">
<headers>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>someusername</wsse:Username>
<wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>somepassword</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</headers>
</endpoint>
</client>
Run Code Online (Sandbox Code Playgroud)
我已设法从c#生成绑定部分(上面未包含)和端点部分.我无法创建标题部分.
出现的错误是:(这是因为当我从c#生成所有内容时,我没有标题部分)
这项服务需要<wsse:Security>,但缺少.
header部分很重要,好像我从配置中排除它并使用config运行代码它也会产生上述错误.
我不想使用web.config/app.config.我必须从C#运行所有东西.(上面的app.config工作正常,但我想通过c#做同样的事情)
更新1 :(首先以编程方式使用BasicHttpBinding)
BasicHttpBinding binding = new BasicHttpBinding();
binding.Name = "Contact";
binding.CloseTimeout = TimeSpan.FromMinutes(1);
binding.OpenTimeout = TimeSpan.FromMinutes(1);
binding.ReceiveTimeout = TimeSpan.FromMinutes(10);
binding.SendTimeout = TimeSpan.FromMinutes(1);
binding.AllowCookies = false;
binding.BypassProxyOnLocal = false;
binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
binding.MaxBufferSize = 524288;
binding.MaxBufferPoolSize = 524288;
binding.MaxReceivedMessageSize = 524288;
binding.MessageEncoding = WSMessageEncoding.Text;
binding.TextEncoding = System.Text.Encoding.UTF8;
binding.TransferMode = TransferMode.Buffered;
binding.UseDefaultWebProxy = …Run Code Online (Sandbox Code Playgroud) try-catch在方法中使用时,如果您希望应用程序即使出现错误也能继续,是否可以通过catch块返回默认值作为return,并记录错误以供日后查看?
例如:
public static string GetNameById(int id)
{
string name;
try
{
//Connect to Db and get name - some error occured
}
catch(Exception ex)
{
Log(ex);
name = String.Empty;
}
return name;
}
Run Code Online (Sandbox Code Playgroud)
例2:
public static string GetIdByName(string name)
{
int id;
try
{
//Connect to Db and get id- some error occured
}
catch(Exception ex)
{
Log(ex);
id = 0;
}
return id;
}
Run Code Online (Sandbox Code Playgroud)
是否可以返回任何默认值(取决于方法的返回类型...... ???),以便需要此方法的结果的应用程序逻辑不会崩溃并继续...
提前致谢...
问候.