[英]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.LogicalSetData
和CallContext.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.