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

时间:2011-08-17 10:19:16

标签: c# httpwebrequest

编辑:使用:

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 "<element>myXML</element>" serverURL

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

Authorization: Basic <a bunch of hex>=\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#把它放进去?我似乎只能使用默认凭据找到合适的示例,这不适用于我正在做的事情。

提前致谢。

1 个答案:

答案 0 :(得分:5)

.NET的WebRequest有一个令人愤怒的默认行为,它只在收到HTTP 401 Not Authorized响应后发送凭据。

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

More details in this post