C#网络凭据没有传递给服务器?

编辑:使用:

byte[] authBytes = System.Text.Encoding.UTF8.GetBytes(user + ":" + password); wr.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes); 

似乎工作正常。

我有一个与CMS通信的应用程序。 我目前正在尝试让这个客户端能够使用“POST”方法将文本/ xml数据上传到CMS。

我可以通过使用curl完美地传递这个:

 curl -u user:password -H "Content-Type:text/xml" -d "myXML" serverURL 

但是,尝试在C#中使用HttpWebRequest我无法让服务器返回我想要的内容。 所以我解雇了Wireshark并查看了实际传递的内容,它几乎完全相同,除了使用curl时我可以看到:

 Authorization: Basic =\r\n Credentials: user:password 

在HTTP标头字段中,在我的客户端的输出中,这些标头字段根本不存在。 (“凭据:”实际上并不是纯文本,它是“授权:”的子树 – 所以我不知道它从何处获取,但用户名和密码是正确的。)

我试图用来设置webrequest凭据的C#代码是这样的:

 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响应后才发送凭据。

手动添加凭据标头(正如您所做的那样)似乎是最佳解决方案。

这篇文章中的更多细节