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

Problems with C# HTTP Post with Authentication

我正在尝试通过HTTP Post发送一些XML。 但是我得到了401 Unauthorized。 有趣的是,当我通过浏览器访问URL时,我提供的用户名/密码可以。

这是我的方法签名:

1
2
        internal static string Send(string URL, string XMLdata, string RequestMethod,
                                    string RequestUsername, string RequestPassword)

我已经尝试将此作为方法主体:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
        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;

还有这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        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时,会提示输入用户名/密码,并且我提供的凭据也可以。

到目前为止,我对该主题的阅读:

  • C#中的HttpClient和表单身份验证
  • 使用HttpWebRequest登录到页面
  • HTTP POST返回错误:417"预期失败。"
  • HTTP Post XML文档-服务器仅接收第一行
  • POST到HTTPS身份验证错误
  • Http发布请求消息正文中的C#Xml

感谢您的帮助。


我解决了实际上,提供商误导了我,使URL出错。如果有人遇到此问题,我发布我的答案的理由是供将来参考。

提供商通过电子邮件向我发送了URL http://api.providersurl.com。当我进入浏览器时,它被重定向到https://api.providersurl.com(HTTPS!)。然后,我便可以使用凭据进行授权。

令我震惊的是,通过访问HTTP URL,我没有得到404 (Not Found)302 (Redirect)。我得到了401 (Unauthorized)。所以我一直努力!和男孩,我尝试过...

当我将代码中的URL更改为HTTPS时,授权与我发布的两个代码一起使用。

花了几个小时...但是,当您学习经验的时候,没有时间会浪费时间。


[根据OP的要求,我正在将评论迁移到答案]

根据您的描述,我没有任何答案,但是我有一个建议:无论浏览器请求成功还是编程请求失败,都可以使用Fiddler查看请求和响应的外观。我怀疑会有所不同。