C#soap client System.OverflowException:算术运算导致溢出

时间:2017-04-12 11:17:22

标签: c# web-services soap integer-overflow mtom

928mb文件工作正常,但是当我尝试向soap服务发送1.08GB时发生这种溢出错误(mtom chunked transfer,_service reference.cs是从wsdl生成的)。在fiddler跟踪中,我只看到请求的标题,但没有请求正文和没有响应

相关代码:

var httpsTransportBindingElement = new HttpsTransportBindingElement
{
    MaxReceivedMessageSize = int.MaxValue,
    TransferMode = TransferMode.Streamed //Chunked transfer
};
var binding = new CustomBinding();
var mtomEncoding = new MtomMessageEncodingBindingElement(MessageVersion.Soap12, Encoding.UTF8);
mtomEncoding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
binding.Elements.Add(mtomEncoding);
binding.Elements.Add(httpsTransportBindingElement);
binding.SendTimeout = TimeSpan.FromHours(1);
binding.ReceiveTimeout = TimeSpan.FromMinutes(5);
_service = new FileuploadSoapPortTypeClient(binding, new EndpointAddress(configuration.HttpUploadUrl));
_service.PostFile(request);

错误堆栈跟踪如下:

System.OverflowException: Arithmetic operation resulted in an overflow. 

Server stack trace: 
at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count) 
at System.Xml.XmlMtomWriter.WriteXOPBinaryParts() 
at System.ServiceModel.Channels.Message.WriteMessagePostamble(XmlDictionaryWriter writer) 
at System.ServiceModel.Channels.MtomMessageEncoder.WriteMessage(Message message, Stream stream, String startInfo, String boundary, String startUri, Boolean writeMessageHeaders) 
at System.ServiceModel.Channels.HttpOutput.WriteStreamedMessage(TimeSpan timeout) 
at System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout) 
at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest(Message message, TimeSpan timeout) 
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) 
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout) 
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 

Exception rethrown at [0]: 
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
at MyServiceClient.FileuploadSoapPortType.PostFile(UploadRequest request) 
at MyServiceClient.FileuploadSoapPortType.PostFile(UploadRequest request) in C:\MyServiceClient\Reference.cs:line 8473 

我无法对PostFile()调用进行调试,所以我的问题是 - 在服务器或客户端发生错误的位置?当然如何修复它?谢谢!

1 个答案:

答案 0 :(得分:0)

在堆栈跟踪中,它告诉您它是服务器端:

Server stack trace:

错误是由以下情况引起的:

at MyServiceClient.FileuploadSoapPortType.PostFile(UploadRequest request) in C:\MyServiceClient\Reference.cs:line 8473 

访问该文件,看看该行发生了什么。我想要考虑托管Web服务的位置,当发生类似这样的事情时,他们会记录日志。

找出我建议的原因:

  • 给出它发生的时间(如果它们的日志更容易找到堆栈跟踪)
  • 发生错误时尝试执行的操作的详细说明。