Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Soap服务抛出;反应过早结束,至少<;X>;需要额外的字节。”;(例外情况)_C#_Asp.net Core_Soap_.net Core_Gzip - Fatal编程技术网

C# Soap服务抛出;反应过早结束,至少<;X>;需要额外的字节。”;(例外情况)

C# Soap服务抛出;反应过早结束,至少<;X>;需要额外的字节。”;(例外情况),c#,asp.net-core,soap,.net-core,gzip,C#,Asp.net Core,Soap,.net Core,Gzip,我正在将代码从asp.net迁移到core 3.1。 我在使用Soap服务时遇到以下问题: 当我调用服务的方法时,我得到一个IOException,其中包含以下消息: “响应提前结束,至少需要额外的字节。” 数字是无法从响应流读取的字节数(剩余字节) 响应用gzip压缩 在ASP.Net代码中,Soap服务方法是一个同步方法,而核心中的方法是异步方法 此外,在从.WSDL文件创建服务之后,我需要将Reference.cs文件中的服务的基本URL从http更改为https,因为所有响应都返回重

我正在将代码从asp.net迁移到core 3.1。 我在使用Soap服务时遇到以下问题: 当我调用服务的方法时,我得到一个IOException,其中包含以下消息: “响应提前结束,至少需要额外的字节。” 数字是无法从响应流读取的字节数(剩余字节)

  • 响应用gzip压缩
  • 在ASP.Net代码中,Soap服务方法是一个同步方法,而核心中的方法是异步方法
此外,在从.WSDL文件创建服务之后,我需要将Reference.cs文件中的服务的基本URL从http更改为https,因为所有响应都返回重定向状态。 当我手动更改Reference.cs文件时,出现了错误,因此我创建了一个CustomBinding,以便使用Https模式注入URL:

var customBinding = new BasicHttpsBinding
    {
        MaxReceivedMessageSize = 20000000,
        MaxBufferPoolSize = 20000000,
        AllowCookies = false,
        BypassProxyOnLocal = false,
        ReaderQuotas = XmlDictionaryReaderQuotas.Max,
        TextEncoding = Encoding.UTF8
    };

customBinding.CreateBindingElements().AddRange(
    new HttpsTransportBindingElement
    {
        MaxReceivedMessageSize = 20000000,
        MaxBufferSize = 20000000,
    });

_service = new masterPricerPortTypeClient(customBinding, new EndpointAddress("https://..."));
_service.Endpoint.Binding = customBinding;
之后,我可以在网络跟踪器中看到该请求得到了有效响应,但是当我试图处理响应时,我得到了上面的IOException

我试图从服务客户端调用操作:

SearchReply searchReply = await _service.SearchAsync(searchRequest);
但我在上面这行代码中得到了一个例外

我试图通过HttpWebRequest调用该方法:

using (var resp = (HttpWebResponse)webRequest.GetResponse())
{
    using (var contentStream = resp.GetResponseStream())
    {
        contentStream.ReadTimeout = 1000;
        var bufferSize = 2048;
        var buffer = new byte[bufferSize];
        var result = new List<byte>();

        try
        {
            var readBytes = 0;
            while ((readBytes = contentStream.ReadAsync(buffer).Result) != 0)
            {
                for (int i = 0; i < readBytes; i++)
                {
                    result.Add(buffer[i]);
                }
            }
使用(var resp=(HttpWebResponse)webRequest.GetResponse()
{
使用(var contentStream=resp.GetResponseStream())
{
contentStream.ReadTimeout=1000;
var bufferSize=2048;
var buffer=新字节[bufferSize];
var result=新列表();
尝试
{
var readBytes=0;
而((readBytes=contentStream.ReadAsync(buffer.Result)!=0)
{
for(int i=0;i
但是在执行了一些读取操作之后,我在“while”循环中得到了异常


是否有人遇到此问题或可以提供帮助?

响应标题是什么?是否有内容长度标题?是的,内容长度标题包含soap响应中的字符数(而不是字节数)。如果是这种情况,则服务器违反了协议。请参阅:“当允许消息正文的消息中给出内容长度时,其字段值必须与消息正文中的八位字节数完全匹配。HTTP/1.1用户代理必须在收到和检测到无效长度时通知用户。“谢谢。好的,如果我从soap服务的响应中得到这个头,我该怎么办?修复服务。或者使用TcpClient来实现服务器正在使用的非标准协议。