繁体   English   中英

Web API - 使用HttpRequestMessage id设置每个线程?

[英]Web API - Set each thread with the HttpRequestMessage id?

我用c#编写了一个web api。

web api使用与其他内部组件共享的功能。 它依赖于单线程流,并使用线程本地存储来存储对象和会话信息。 请不要说它是好还是坏,这就是我要处理的问题。

在web api中,我使用SendAsync实现了一个自定义消息处理程序(DelagatingHandler)

protected async override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)

它基于TPL并且有时会切换线程,当发生这种情况时,我的基于线程的功能会搞砸,因为我正在丢失线程上下文和分配给它的所有数据。

我的想法是唯一地标识HttpRequestMessage,我认为使用相关id应该足够了

var requestId = request.GetCorrelationId();

但我想存储每个在Task中分配的线程的HttpRequestMessage的相关Id。

所以我的问题基本上是,如果我可以识别在特定任务下分配的线程并为其分配ID?

对于与上下文相关的问题,您可以使用CallContext.LogicalSetDataCallContext.LogicalGetData ,它只是一个IDictionary<string, object> ,它在上下文之间流动,并具有写时复制(浅拷贝)语义。

由于您的数据是不可变的(根据文档 ),您可以将您的相关ID映射到您的线程托管线程ID:

protected async override Task<HttpResponseMessage> SendAsync(
                         HttpRequestMessage request, 
                         CancellationToken cancellationToken)
{
    var correlationId = request.GetCorrelationId();
    var threadId = Thread.CurrentThread.ManagedThreadId;

    CallContext.LogicalSetData(correlationId.ToString(), threadId);
}

然后检索是否确保您处于“有效线程”。

可以在此处找到具有async-await良好的调用上下文读取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM