C# HTTP代理剥离授权标头需要cooke

C# HTTP代理剥离授权标头需要cooke,c#,cookies,proxy,dotnet-httpclient,C#,Cookies,Proxy,Dotnet Httpclient,我正试图在我的C#应用程序中的web代理后面使用REST API,它需要基本的身份验证 我已经使用Postman chrome应用程序测试了我的凭据,并验证了它们是否有效。然而,当我运行我的C#应用程序时,我收到一个401未经授权的响应 在查看了一些Postman请求的痕迹并将其与我的C#应用程序一起使用后,我认为正在发生的事情是,我背后的web代理没有转发授权标头,因为我的请求缺少一个cookie,而cookie(我认为)是由更智能的web客户端(例如,Postman,它构建在Chrome之上

我正试图在我的C#应用程序中的web代理后面使用REST API,它需要基本的身份验证

我已经使用Postman chrome应用程序测试了我的凭据,并验证了它们是否有效。然而,当我运行我的C#应用程序时,我收到一个401未经授权的响应

在查看了一些Postman请求的痕迹并将其与我的C#应用程序一起使用后,我认为正在发生的事情是,我背后的web代理没有转发授权标头,因为我的请求缺少一个cookie,而cookie(我认为)是由更智能的web客户端(例如,Postman,它构建在Chrome之上)设置的。我可以在邮递员网络跟踪中看到,它正在发送一个看起来与代理相关的cookie

我不知道如何在我的C#应用程序中复制它,因为我使用的是相当高级的API。如有任何帮助,将不胜感激:

更新: 通过复制跟踪中看到的cookie并将其添加到请求中(通过将其插入
CookieStore
),我可以让它工作。然而,我不知道如何才能使它自动。Chrome必须以某种方式获取并存储这个cookie值。有没有办法让我的申请也这么做

WebRequest.DefaultWebProxy.Credentials=CredentialCache.DefaultNetworkCredentials;
HttpClientHandler handler=新的HttpClientHandler()
{
UseCookies=true,
CookieContainer=新系统.Net.CookieContainer()
};
HttpClient=新的HttpClient(处理程序);
var byteArray=Encoding.UTF8.GetBytes(用户+“:”+PASS);
client.DefaultRequestHeaders.Authorization=
新的System.Net.Http.Headers.AuthenticationHeaderValue(“基本”,
Convert.tobase64字符串(byteArray));
var content=newformurlencodedcontent(新字典{
{“field1”、“value1”},
{“field2”,“value2”}
});
Console.WriteLine(“发送请求”);
var response=wait client.PostAsync(HTTP_URL,content);
var responseString=await response.Content.ReadAsStringAsync();
Console.WriteLine(“服务器响应(“+response.StatusCode+”):\n“+responseString);

看起来您已经正确地“启用”了Cookie,因此您在响应中得到的任何信息都应该与后续的每个请求一起自动发送,前提是您正在为每个请求重用相同的
HttpClient
实例

作为补充说明,如果您不介意一个小的库依赖性,[免责声明:我是作者]将大大简化您的代码:

var client = new FlurlClient().EnableCookies();

var response = await HTTP_URL
    .WithClient(client)
    .WithBasicAuth(USER, PASS)
    .PostUrlEncodedAsync(new {
        field1 = "value1",
        field2 = "value2",
    });

看起来您已经正确地“启用”了Cookie,因此您在响应中得到的任何信息都应该随每个后续请求一起自动发送,前提是您正在为每个请求重用相同的
HttpClient
实例

作为补充说明,如果您不介意一个小的库依赖性,[免责声明:我是作者]将大大简化您的代码:

var client = new FlurlClient().EnableCookies();

var response = await HTTP_URL
    .WithClient(client)
    .WithBasicAuth(USER, PASS)
    .PostUrlEncodedAsync(new {
        field1 = "value1",
        field2 = "value2",
    });