gpt4 book ai didi

c# - DelegatingHandler 设置 CurrentPrincipal

转载 作者:行者123 更新时间:2023-12-02 22:00:32 24 4
gpt4 key购买 nike

我正在尝试对 DelegateHandler 的实现进行单元测试。我的简化实现:

public class FooHandler
: DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
Thread.CurrentPrincipal = new GenericPrincipal(
new GenericIdentity("Vegard"), new[] { "A", "B" });

return await base.SendAsync(request, cancellationToken);
}
}

当我尝试对此进行单元测试时,我会这样做:

public class TestHandler : DelegatingHandler
{
private readonly Func<HttpRequestMessage,
CancellationToken, Task<HttpResponseMessage>> _handlerFunc;
public TestHandler()
{
_handlerFunc = (r, c) => Return(HttpStatusCode.OK);
}

protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
return _handlerFunc(request, cancellationToken);
}

public static Task<HttpResponseMessage> Return(HttpStatusCode status)
{
return Task.Factory.StartNew(
() => new HttpResponseMessage(status));
}
}

[TestMethod]
public async Task SendAsync_CorrectTokens_IsAuthorized()
{
var message = new HttpRequestMessage(HttpMethod.Get, "http://www.test.com");

var handler = new AuthorizationHeaderHandler
{
InnerHandler = new TestHandler()
};

var invoker = new HttpMessageInvoker(handler);
var result = await invoker.SendAsync(message, new CancellationToken());

Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);
Assert.IsTrue(Thread.CurrentPrincipal.Identity.IsAuthenticated); // fails
Assert.AreEqual("Vegard", Thread.CurrentPrincipal.Identity.Name); // fails
}

我猜这是因为 HttpMessageInvoker 在单独的线程上运行 DelegateHandler。我可以强制它们在同一个线程上吗?

最佳答案

Can I force these to be on the same thread?

你不能。

更好的问题是“我如何将 Thread.CurrentPrincipal 流向正在执行请求的任何线程”?这个问题答案。

Thread.CurrentPrincipal 在 ASP.NET 中很奇怪。事实上,我建议您根本不要使用它;使用 HttpContext.User 代替。但如果您愿意,您可以通过了解以下几点来让它发挥作用:

  1. HttpContext.User 由 ASP.NET SynchronizationContext 传输。
  2. Thread.CurrentPrincipal 会在线程进入 ASP.NET 请求 SynchronizationContext 时被 HttpContext.User 覆盖。

不幸的是,您当前的测试在几个关键点上存在缺陷:

  • 请求完成后,Thread.CurrentPrincipal的值未定义。
  • 您当前运行测试的方式没有 HttpContext(或 ASP.NET SynchronizationContext),这会干扰主要用户的流动。

要全面测试授权,您需要进行集成测试。

另见 my answer to this question .

关于c# - DelegatingHandler 设置 CurrentPrincipal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17023682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com