阻止 HttpWebRequest 检查我的有效负载

Posted

技术标签:

【中文标题】阻止 HttpWebRequest 检查我的有效负载【英文标题】:Stop HttpWebRequest from checking my payload 【发布时间】:2016-01-04 14:23:31 【问题描述】:

我需要将自定义有效负载发送到网络服务器,并且我使用 HttpWebRequest 来执行此操作。就我而言,它是一个 json-rpc。我认为我发送什么并不重要,只要它不是像 html 表单或邮件附件那样编码的表单数据。

查看我的代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.0.108/api/homematic.cgi");

byte[] rpc_request = Encoding.ASCII.GetBytes(" \"method\": \"Session.login\", \"params\": [ \"username\": \"root\", \"password\": \"root\" ], \"id\": null");

request.ContentLength = rpc_request.Length;
request.ContentType = "application/json";

using (var stream = request.GetRequestStream())
    stream.Write(rpc_request, 0, rpc_request.Length);

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Console.WriteLine("Status Code = 0", response.StatusCode);
Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());

非常简单。但是C#不喜欢payload的内容,在调用request.GetRequestStream().Write时会抛出System.Net.ProtocolViolationException。我什至无法启动请求!

为什么 C# 会查看负载的内容,我该如何阻止它?

【问题讨论】:

【参考方案1】:

如果您想写入请求流,请确保您使用的动词与 GET 不同。 POST 可能是向 Web 服务器发送数据的理想选择。

request.Method = "POST";

如果您没有明确指定 HTTP 动词,则假定 GET 解释了您收到错误的原因。

您也可以考虑将IDisposable 资源包装在using 语句中,以使您的代码更好一点。更不用说可能值得摆脱的未使用的 webClient 变量:

var request = (HttpWebRequest)WebRequest.Create("http://192.168.0.108/api/homematic.cgi");
string requestBody = " \"method\": \"Session.login\", \"params\": [ \"username\": \"root\", \"password\": \"root\" ], \"id\": null";

request.ContentType = "application/json";
request.Method = "POST";
using (var stream = request.GetRequestStream())
using (var writer = new StreamWriter(stream))

    stream.Write(requestBody);


using (var response = (HttpWebResponse)request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))

    Console.WriteLine("Status Code = 0", response.StatusCode);
    Console.WriteLine(reader.ReadToEnd());


Console.ReadLine();

【讨论】:

这似乎行得通,但是当方法改变时,为什么C#会做不同的事情呢?有效载荷部分在每个方法中都是一样的,或者是吗? 抱歉,我不确定我是否理解您的问题。这就是 HTTP 协议的工作原理。如果您想随请求一起发送正文,请使用 POST 或 PUT 动词。 GET 动词没有主体。所以这不是 C# 的真正问题。该框架只是告诉您,您在制作 GET 动词时尝试写入请求流,从而违反了您正在使用的协议。如需进一步参考,我建议您阅读 HTTP 协议规范:rfc-base.org/txt/rfc-2616.txt

以上是关于阻止 HttpWebRequest 检查我的有效负载的主要内容,如果未能解决你的问题,请参考以下文章

HttpWebRequest 在第一次失败后总是失败

来自本地 WCF 服务的 HttpWebRequest

Chrome CORB 阻止 APIGateway lambda 请求

如何在处理负零时有效地比较两个浮点值的符号

为啥使用 HttpClient 而不是 HttpWebRequest 进行同步请求

阻止 SKSpriteNode 减速