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

C# Web API-使用HttpRequestMessage id设置每个线程?,c#,.net,multithreading,task-parallel-library,asp.net-web-api,C#,.net,Multithreading,Task Parallel Library,Asp.net Web Api,我有一个用c#编写的web api web api使用与其他内部组件共享的功能。 它依赖于单线程流,并使用线程本地存储来存储对象和会话信息。 请不要说是好是坏,这是我必须处理的 在WebAPI中,我用SendAsync实现了一个自定义消息处理程序(DelagatingHandler) protected async override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessag

我有一个用c#编写的web api

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

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

protected async override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
但是我想为任务中分配的每个线程存储HttpRequestMessage的相关Id


因此,我的问题基本上是,我是否可以识别在特定任务下分配的线程,并将id分配给它?

对于与上下文相关的问题,可以使用and,and只是一个
IDictionary
,它在上下文之间流动,并具有写时拷贝(浅拷贝)语义

由于数据是不可变的(根据),因此可以将关联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);
}
受保护的异步覆盖任务SendAsync(
HttpRequestMessage请求,
取消令牌(取消令牌)
{
var correlationId=request.GetCorrelationId();
var threadId=Thread.CurrentThread.ManagedThreadId;
CallContext.LogicalSetData(correlationId.ToString(),threadId);
}
然后检索if以确保您处于“有效线程”上


可以找到具有
async await
的良好的调用时读取上下文。

是否要将请求(关联id)映射到它遇到的第一个线程?我实际上想从其上下文中的任何线程识别该请求,我假设关联Id是与分配给请求的第一个线程一起分配的。但是,不管上下文流如何,在方法中
wait
之后,您仍然在相同的
HttpRequestMessage
中,但是线程可能不同。我可能仍然不理解这是彻底的问题,这正是我的问题,如果线程改变了,我就失去了我的范围(自定义范围),并且我想知道我当前所在的线程是否已经被分配给我认为是一个有效的上下文,这就是HypReQuestMasaGe.上下文。有意义吗?\谢谢你的回复,我会尝试一下,让你保持联系。这正是我想要的,再次感谢。
protected async override Task<HttpResponseMessage> SendAsync(
                         HttpRequestMessage request, 
                         CancellationToken cancellationToken)
{
    var correlationId = request.GetCorrelationId();
    var threadId = Thread.CurrentThread.ManagedThreadId;

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