关于webclient:401在C#中通过Azure Traffic Manager连接到API时未经授权

401 Unauthorized when connecting to API through Azure Traffic Manager in C#

我有以下代码可以成功连接到C#中的第三方API:

1
2
3
4
5
6
7
using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential(login.Username, login.Password);

    var xml = client.DownloadString(url);
    Debug.Write(xml);
}

直接连接到API时,此方法工作正常。但是,我试图利用Azure Traffic Manager将负载分散到多个终结点,并且在执行此操作时遇到401未经授权的异常。使用Postman之类的工具并在请求中配置基本身份验证,它似乎可以正常工作。

我试图将代码转换为RestSharp,但它似乎具有相同的症状。

以下是来自Fiddler的使用几种不同技术的请求:

将C#/ WebClient直接连接到API端点(成功)

1
2
3
4
5
6
7
8
9
GET <ApiUrl> HTTP/1.1
Host: <ApiHost>
Connection: Keep-Alive

401 Unauthorized

GET <ApiUrl> HTTP/1.1
Authorization: Basic <AuthToken>
Host: <ApiHost>

C#/ WebClient到Azure Traffic Manager(401未经授权)

1
2
3
4
5
6
7
GET <TrafficManagerApiUrl> HTTP/1.1
Host: <TrafficManagerApiHost>

401 Unauthorized

GET <ApiUrl> HTTP/1.1
Host: <ApiHost>

Azure Traffic Manager的邮递员(成功)

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
GET <TrafficManagerApiUrl> HTTP/1.1
Host: <TrafficManagerApiHost>
Connection: keep-alive
Authorization: Basic <AuthToken>
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Postman-Token: 13396800-33ab-8d7b-664f-68b99e8f4ac1
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8


302 Redirect

GET <ApiUrl> HTTP/1.1
Host: <ApiHost>
Connection: keep-alive
Authorization: Basic <AuthToken>
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Postman-Token: 13396800-33ab-8d7b-664f-68b99e8f4ac1
Accept: */
*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Cookie: JSESSIONID=<jsessionid>


我没有正确处理Azure Traffic Manager的重定向。

答案在这里详细说明:

https://stackoverflow.com/a/28671822/86191