【问题标题】:Setting cookies to httpClient of Asp.Net Core TestServer将 cookie 设置为 Asp.Net Core TestServer 的 httpClient
【发布时间】:2019-09-08 21:27:30
【问题描述】:

我正在使用 TestServer 测试 ASP.NET Core 应用程序,并且有些控制器需要 cookie 身份验证。我已经创建了这样的测试服务器实例:

_testServer = new TestServer(new WebHostBuilder()
            .UseEnvironment(CustomEnvironments.Test)
            .UseContentRoot(currentDirectory)                
            .UseStartup<Web.Startup>()
            .UseUrls("http://localhost/"));

ApiClient = _testServer.CreateClient();

现在我必须添加 auth cookie,但它被服务器忽略了。如果可以直接创建客户端,我可以将HttpClientHandler 传递给构造函数并将UseCookies 设置为false,它可以工作,但是当我从测试服务器获取客户端时,我无法访问处理程序。有没有办法添加 auth cookie 来测试客户端?

【问题讨论】:

  • cookies可以在请求时直接设置

标签: c# testing cookies asp.net-core


【解决方案1】:

我找到了解决方案。 TestServer 有方法CreateRequest(string path),它返回RequestBuilder,允许将cookies插入到header中

【讨论】:

  • 如果你能发布一些关于你如何使用RequestBuilder做到这一点的代码,我会喜欢@alexk
【解决方案2】:

使用@AlexK 的答案作为灵感,结合来自a blog post 的信息(顺便说一句,在处理向测试服务器发送请求时的其他问题时,这篇文章介绍了许多其他有用的细节),这是一种方法根据我在自己的项目中使用的内容,使用 CreateRequest(string path) 让 cookie 与 TestServer 一起工作。

public class TestWebEnvironment : IDisposable
{
    private TestServer Server { get; }
    private CookieContainer CookieContainer { get; }

    public TestWebEnvironment()
    {
        var builder = new WebHostBuilder()
            .UseEnvironment("Test")
            .UseStartup<TestWebStartup>();

        Server = new TestServer(builder);
        CookieContainer = new CookieContainer();
    }

    private RequestBuilder BuildRequest(string url)
    {
        var uri = new Uri(Server.BaseAddress, url);
        var builder = Server.CreateRequest(url);

        var cookieHeader = CookieContainer.GetCookieHeader(uri);
        if (!string.IsNullOrWhiteSpace(cookieHeader))
        {
            builder.AddHeader(HeaderNames.Cookie, cookieHeader);
        }

        return builder;
    }

    private void UpdateCookies(string url, HttpResponseMessage response)
    {
        if (response.Headers.Contains(HeaderNames.SetCookie))
        {
            var uri = new Uri(Server.BaseAddress, url);
            var cookies = response.Headers.GetValues(HeaderNames.SetCookie);
            foreach (var cookie in cookies)
            {
                CookieContainer.SetCookies(uri, cookie);
            }
        }
    }

    public async Task<string> GetAsync(string url)
    {
        using (var response = await BuildRequest(url).GetAsync())
        {
            UpdateCookies(url, response);
            return await response.Content.ReadAsStringAsync();
        }
    }

    public async Task<string> PostAsync(string url, HttpContent content)
    {
        var builder = BuildRequest(url);
        builder.And(request => request.Content = content);
        using (var response = await builder.PostAsync())
        {
            UpdateCookies(url, response);
            return await response.Content.ReadAsStringAsync();
        }
    }

    public void Dispose()
    {
        Server.Dispose();
    }
}

【讨论】:

    猜你喜欢
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2021-12-14
    • 2018-08-21
    • 2016-09-16
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多