使用 REST 客户端应用发送 Web 请求可以工作,但使用 C# 时无法工作。

7
我正在使用C#的WebRequest和HttpClient向一个API发送POST请求,但总是从API那里收到一个错误消息,该消息称您在标头中发布了无效数据。但问题在于,当我使用Chrome扩展程序“高级REST客户端”发送相同的数据时,它可以正常工作,并且我比较了两个请求,没有任何不同之处。我已经附上了两个请求和我的代码,请有人帮忙找出问题所在。
这是来自REST客户端应用的请求:

enter image description here

这是来自C#的请求

enter image description here

这里是我的C#代码

 string item = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>" +
  "<request>" +
  "<Username>admin</Username>" +
  "<Password>" + password + "</Password>" +
  "<password_type>4</password_type>" +
  "</request> ";
var request = (HttpWebRequest)WebRequest.Create("http://192.168.8.1/api/user/login");
request.Method = "POST";
request.Headers["_RequestVerificationToken"]= Token;
request.Headers["Cookie"] = Sess;
byte[] bytes = Encoding.UTF8.GetBytes(item);
request.ContentType = "application/xml;charset=UTF-8";
request.ContentLength = bytes.Length;
Stream streamreq = request.GetRequestStream();
streamreq.Write(bytes, 0, bytes.Length);
streamreq.Close();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    var result = reader.ReadToEnd();
}

你调用的是哪个API(是https://github.com/arska/e3372/issues/1吗)?他们有没有记录`125002`代码的含义? - mjwills
@mjwills 每次请求时sessinid和token都会更改,问题是我发送了一个来自API获取的有效session和token ID,但在C#中没有返回ok,并且错误代码显示会话无效,这是华为LTE调制解调器的API。 - Younis Qadir
这是一个密码的例子:ZTJkZGZhZGZjZmZlMjk0OGQ4MGZmZTk3NGRjMDE4MWY4NmIyMzcwZjRjNzg0ZjMyNmFjNGE4NmRmZmE4MGI0MA==,由Base64Encode(Sha256(用户名+Base64Encode(Sha256(密码))+令牌))生成。用户名为admin,密码为admin。 - Younis Qadir
你应该使用类似于RestSharp或ReFit等工具,而不是使用WebRequest等。 - Akash Kava
我使用了RestSharp并得到了相同的结果,也尝试了Java也是一样的,但在Postman和Arc中测试它可以工作。 - Younis Qadir
显示剩余5条评论
2个回答

4

左图中的__RequestVerificationToken看起来有两个下划线,所以请尝试这样做:

request.Headers["__RequestVerificationToken"]= Token;

在评论中,我建议使用小型大写字母,但是HTTP标头中的字段名称不区分大小写,因此额外的下划线应该可以解决问题。 - Ulf Kristiansen

1
主要的区别在于在API中,您正在发送请求。
application/xml 

但是在你发送的 C# 代码中。
application/xml;charset=UTF-8;

在您的API中,内容长度为230,在C#中,内容长度为227,少3个字符。
现在,这可能是一个冒险,但字符集在每个浏览器和每种语言中都有不同的工作方式,因此在您的代码中添加charset=UTF-8时可能会出现问题。
按以下方式发送您的请求:
 string item = "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>" +
  "<request>" +
  "<Username>admin</Username>" +
  "<Password>" + password + "</Password>" +
  "<password_type>4</password_type>" +
  "</request> ";
var request = (HttpWebRequest)WebRequest.Create("http://192.168.8.1/api/user/login");
request.Method = "POST";
request.Headers["_RequestVerificationToken"]= Token;
request.Headers["Cookie"] = Sess;
byte[] bytes = Encoding.UTF8.GetBytes(item);
request.ContentType = "application/xml";
request.ContentLength = bytes.Length;
Stream streamreq = request.GetRequestStream();
streamreq.Write(bytes, 0, bytes.Length);
streamreq.Close();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    var result = reader.ReadToEnd();
}

1
非常感谢,问题出在使用了两个下划线的请求验证令牌。 - Younis Qadir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接