带有类型化客户端的 cookieContainer

ume*_*110 7 c# cookiecontainer dotnet-httpclient .net-core httpclientfactory

需要向需要特定cookie的服务器发出请求。能够使用 HTTP 客户端和带有 cookiecontainer 的处理程序来完成此操作。通过使用类型化客户端,无法找到设置 cookiecontainer 的方法。

使用http客户端:

var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (HttpClient client = new HttpClient(handler))
{
    //.....

    // Used below method to add cookies
    AddCookies(cookieContainer);

    var response = client.GetAsync('/').Result;
} 
Run Code Online (Sandbox Code Playgroud)

使用 HttpClientFactory:

在startup.cs中

services.AddHttpClient<TypedClient>().
           ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
           {
               CookieContainer = new CookieContainer()
            });
Run Code Online (Sandbox Code Playgroud)

在控制器类中

// Need to call AddCookie method here
var response =_typedclient.client.GetAsync('/').Result;
Run Code Online (Sandbox Code Playgroud)

在 Addcookie 方法中,我需要将 cookie 添加到容器中。任何建议如何做到这一点。

Nko*_*osi 5

创建一个抽象来提供对实例的访问CookieContainer

例如

public interface ICookieContainerAccessor {
    CookieContainer CookieContainer { get; }
}

public class DefaultCookieContainerAccessor : ICookieContainerAccessor {
    private static Lazy<CookieContainer> container = new Lazy<CookieContainer>();
    public CookieContainer CookieContainer => container.Value;
}
Run Code Online (Sandbox Code Playgroud)

在启动期间将 cookie 容器添加到服务集合中,并使用它来配置主要 HTTP 消息处理程序

启动.配置服务

//create cookie container separately            
//and register it as a singleton to be accesed later
services.AddSingleton<ICookieContainerAccessor, DefaultCookieContainerAccessor>();

services.AddHttpClient<TypedClient>()
    .ConfigurePrimaryHttpMessageHandler(sp =>
        new HttpClientHandler {
            //pass the container to the handler
            CookieContainer = sp.GetRequiredService<ICookieContainerAccessor>().CookieContainer
        }
    );
Run Code Online (Sandbox Code Playgroud)

最后,在需要的地方注入抽象

例如

public class MyClass{
    private readonly ICookieContainerAccessor accessor;
    private readonly TypedClient typedClient;

    public MyClass(TypedClient typedClient, ICookieContainerAccessor accessor) {
        this.accessor = accessor;
        this.typedClient = typedClient;
    }

    public async Task SomeMethodAsync() {
        // Need to call AddCookie method here           
        var cookieContainer = accessor.CookieContainer;
        AddCookies(cookieContainer);

        var response = await typedclient.client.GetAsync('/');

        //...
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)