我正在尝试通过HTTP Post发送一些XML。但我得到了401 Unauthorized
。有趣的是,当我通过浏览器访问URL时,我提供的用户名/密码都没问题。
这是我的方法签名:
internal static string Send(string URL, string XMLdata, string RequestMethod,
string RequestUsername, string RequestPassword)
我尝试过这个方法体:
string requestData = XMLdata;
string responseData = "";
StreamWriter myWriter = null;
HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(URL);
objRequest.Method = RequestMethod;
objRequest.PreAuthenticate = true;
objRequest.ContentType = "application/x-www-form-urlencoded";//"text/xml";
objRequest.Credentials = new NetworkCredential(RequestUsername, RequestPassword);;
objRequest.ContentLength = requestData.Length;
try
{
myWriter = new StreamWriter(objRequest.GetRequestStream());
myWriter.Write(requestData);
}
finally
{
myWriter.Close();
}
StreamReader sr = null;
try
{
HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
sr = new StreamReader(objResponse.GetResponseStream());
responseData = sr.ReadToEnd();
}
finally
{
if (sr != null)
sr.Close();
}
return responseData;
还有这个:
string result;
using (var client = new WebClient())
{
Uri requestUri = new Uri(URL);
CredentialCache cache = new CredentialCache();
NetworkCredential nc = new NetworkCredential(RequestUsername, RequestPassword);
cache.Add(requestUri, "Basic", nc);
client.Credentials = cache;
result = client.UploadString(requestUri, XMLdata);
}
return result;
两者都得到401
。我究竟做错了什么?只是提醒一下:当我通过浏览器访问URL时,会提示输入用户名/密码,我提供的凭据就可以了。
到目前为止我对这个问题的阅读:
我很感激帮助。
答案 0 :(得分:1)
[根据OP的要求,我正在将我的评论转移到答案]
根据您的描述,我没有给您答案,但我确实有一个建议:使用Fiddler查看请求和响应的内容,无论是在浏览器请求成功时,还是在程序化请求失败。我怀疑会对你产生影响。
答案 1 :(得分:1)
我解决了。实际上我被提供商误导了URL错误。我发布我的答案的原因是为了将来参考,如果有人遇到这个。
提供商通过电子邮件向我发送了网址http://api.providersurl.com
。当我进入浏览器时,它会被重定向到https://api.providersurl.com
(HTTPS!)。然后,我可以使用凭据进行授权。
让我头撞墙的有趣的事情是,通过访问HTTP网址,我没有得到404 (Not Found)
或302 (Redirect)
。我得到了401 (Unauthorized)
。所以我一直在努力!还有男孩,我试过......
当我将代码中的URL更改为HTTPS时,授权与我发布的两个代码一起使用。
花了几个小时......但是当你学习经验丰富时,没有时间浪费时间。