Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.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# 发送POST请求时ProtocolViolationException异常_C#_Rest_Http Post - Fatal编程技术网

C# 发送POST请求时ProtocolViolationException异常

C# 发送POST请求时ProtocolViolationException异常,c#,rest,http-post,C#,Rest,Http Post,我已经阅读了其他类似的问题,并尝试了这些问题的解决方案,但由于这不起作用,因此我将此贴在这里 当我在下面发送POST请求时,它失败并显示以下错误消息: System.Net.ProtocolViolationException: You must write ContentLength bytes to the request stream before calling [Begin]GetResponse. at System.Net.HttpWebRequest.GetResponse

我已经阅读了其他类似的问题,并尝试了这些问题的解决方案,但由于这不起作用,因此我将此贴在这里

当我在下面发送POST请求时,它失败并显示以下错误消息:

System.Net.ProtocolViolationException: You must write ContentLength bytes to the request stream before calling [Begin]GetResponse.
   at System.Net.HttpWebRequest.GetResponse()
   ....
   ....
我对其他URL端点的GET请求工作正常,我只是在发出POST请求时遇到了这个问题。另外,我已经在代码中适当地设置了ContentLength。我仍然无法发送POST请求。想法

public void TestSubmitJobWithParams1()
    {
        const string RestActionPath = "URL_GOES_HERE";

        // if you have multipe parameters seperate them with teh '&' delimeter.
        var postData = HttpUtility.UrlEncode("MaxNumberOfRowsPerSFSTask") + "=" + HttpUtility.UrlEncode("3000");

        var request = (HttpWebRequest)WebRequest.Create(RestActionPath);
        request.Method = "POST";
        request.Credentials = CredentialCache.DefaultCredentials;
        request.PreAuthenticate = true;
        request.ContentLength = 0;
        request.Timeout = 150000;
        request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache);
        request.ContentType = "application/x-www-form-urlencoded";

        byte[] bytes = Encoding.ASCII.GetBytes(postData);

        request.ContentLength = bytes.Length;

        Stream newStream = request.GetRequestStream();

        newStream.Write(bytes, 0, bytes.Length);


        string output = string.Empty;
        try
        {
            using (var response = request.GetResponse())
            {
                using (var stream = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1252)))
                {
                    output = stream.ReadToEnd();
                }
            }
        }
        catch (WebException ex)
        {
            if (ex.Status == WebExceptionStatus.ProtocolError)
            {
                using (var stream = new StreamReader(ex.Response.GetResponseStream()))
                {
                    output = stream.ReadToEnd();
                }
            }
            else if (ex.Status == WebExceptionStatus.Timeout)
            {
                output = "Request timeout is expired.";
            }
        }
        catch (ProtocolViolationException e)
        {
            Console.WriteLine(e);
        }

        Console.WriteLine(output);
        Console.ReadLine();
    }
有几件事:

首先,您不需要直接设置
ContentLength
,只需将其忽略(默认为-1)。你实际上打了两次电话,所以把两个电话都删除

另外,在调用
GetResponse()

或者,您可以将其放在using语句中,该语句为您处理关闭和处置):

从技术上讲,您也不需要对
postData
使用
HttpUtility.UrlEncode()
,因为字符串中没有任何内容会违反Url的完整性。只要做:

string postData = "MaxNumberOfRowsPerSFSTask=3000");
如果这能帮你解决问题,请告诉我

要获得更全面的概述,请查看以下内容:

特别是关于
ProtocolViolationException
的部分,以及其中的说明:

使用POST方法时,必须获取请求流,写入要发布的数据,然后关闭流。此方法阻止等待内容发布;如果没有设置超时,并且您不提供内容,则调用线程将无限期阻塞

有几件事:

首先,您不需要直接设置
ContentLength
,只需将其忽略(默认为-1)。你实际上打了两次电话,所以把两个电话都删除

另外,在调用
GetResponse()

或者,您可以将其放在using语句中,该语句为您处理关闭和处置):

从技术上讲,您也不需要对
postData
使用
HttpUtility.UrlEncode()
,因为字符串中没有任何内容会违反Url的完整性。只要做:

string postData = "MaxNumberOfRowsPerSFSTask=3000");
如果这能帮你解决问题,请告诉我

要获得更全面的概述,请查看以下内容:

特别是关于
ProtocolViolationException
的部分,以及其中的说明:

使用POST方法时,必须获取请求流,写入要发布的数据,然后关闭流。此方法阻止等待内容发布;如果没有设置超时,并且您不提供内容,则调用线程将无限期阻塞

有几件事:

首先,您不需要直接设置
ContentLength
,只需将其忽略(默认为-1)。你实际上打了两次电话,所以把两个电话都删除

另外,在调用
GetResponse()

或者,您可以将其放在using语句中,该语句为您处理关闭和处置):

从技术上讲,您也不需要对
postData
使用
HttpUtility.UrlEncode()
,因为字符串中没有任何内容会违反Url的完整性。只要做:

string postData = "MaxNumberOfRowsPerSFSTask=3000");
如果这能帮你解决问题,请告诉我

要获得更全面的概述,请查看以下内容:

特别是关于
ProtocolViolationException
的部分,以及其中的说明:

使用POST方法时,必须获取请求流,写入要发布的数据,然后关闭流。此方法阻止等待内容发布;如果没有设置超时,并且您不提供内容,则调用线程将无限期阻塞

有几件事:

首先,您不需要直接设置
ContentLength
,只需将其忽略(默认为-1)。你实际上打了两次电话,所以把两个电话都删除

另外,在调用
GetResponse()

或者,您可以将其放在using语句中,该语句为您处理关闭和处置):

从技术上讲,您也不需要对
postData
使用
HttpUtility.UrlEncode()
,因为字符串中没有任何内容会违反Url的完整性。只要做:

string postData = "MaxNumberOfRowsPerSFSTask=3000");
如果这能帮你解决问题,请告诉我

要获得更全面的概述,请查看以下内容:

特别是关于
ProtocolViolationException
的部分,以及其中的说明:

使用POST方法时,必须获取请求流,写入要发布的数据,然后关闭流。此方法阻止等待内容发布;如果没有设置超时,并且您不提供内容,则调用线程将无限期阻塞


您确定要ASCII编码吗?这将把任何代码大于127的字符变成问号。这将导致您的程序在除美国英语以外的几乎任何语言环境下都会失败,并且很可能会失败。您确定要使用ASCII编码吗?这将把任何代码大于127的字符变成问号。这将导致您的程序在除美国英语以外的几乎任何语言环境下都会失败,并且很可能会失败。您确定要使用ASCII编码吗?这将把任何代码大于127的字符变成问号。这将导致您的程序在除美国英语以外的几乎任何语言环境下都会失败,并且很可能会失败。您确定要使用ASCII编码吗?这将把任何代码大于127的字符变成问号。这将导致您的程序在除美国英语以外的几乎任何语言环境下都会失败,而且很可能是因为美国英语。