c#网络凭据没有传递给服务器
本文关键字:服务器 网络 | 更新日期: 2023-09-27 18:05:55
Edit: Using:
byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(user + ":" + password);
wr.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);
似乎工作得很好。
我有一个与CMS通信的应用程序。我目前正试图让这个客户端能够使用"POST"方法将文本/xml数据上传到CMS。
我可以用旋度很好地传递这个
curl -u user:password -H "Content-Type:text/xml" -d "<element>myXML</element>" serverURL
然而,试图在c#中使用HttpWebRequest,我无法让服务器返回我想要的东西。所以我启动了Wireshark,看看实际传递了什么,除了使用curl我可以看到:
之外,它几乎是一样的。Authorization: Basic <a bunch of hex>='r'n
Credentials: user:password
在HTTP报头字段中,而在我的客户端的输出中,这些报头字段根本不存在。("凭据:"实际上不是纯文本,它是"授权:"的子树-所以我不确定它是从哪里得到的,但用户名和密码是正确的。)
我试图使用c#代码来设置webrequest的凭据是这样的:
NetworkCredential myCred = new NetworkCredential(
user, password, serverURL);
CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri(serverURL), "Basic", myCred);
HttpWebRequest wr = (HttpWebRequest) HttpWebRequest.Create(serverURL);
wr.Credentials = myCache;
我也试过这样设置凭据(不指定serverURL):
wr.Credentials = new NetworkCredential(user,password,serverURL);
但这仍然不能使它显示在wireshark中。有人知道吗?
A)授权信息实际上应该在HTTP报头中才能工作,并且B)如果是-那么我如何使c#把它放进去?我似乎只能找到使用默认凭证的像样的例子,这并不适用于我正在做的事情。
。. NET的WebRequest有一个令人恼火的默认行为,它只在收到HTTP 401 Not Authorized响应后才发送凭据。
手动添加凭证头(就像你所做的那样)似乎是最好的解决方案。
更多的细节在这篇文章