带有身份验证的C#HTTP Post的问题

时间:2011-05-24 19:44:42

标签: c# http authentication

我正在尝试通过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时,会提示输入用户名/密码,我提供的凭据就可以了。

到目前为止我对这个问题的阅读:

我很感激帮助。

2 个答案:

答案 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时,授权与我发布的两个代码一起使用。

花了几个小时......但是当你学习经验丰富时,没有时间浪费时间。