我们在深度抽象程序集中的某个地方有一个从 OperationContext.Current 读取数据的 WCF 行为,当从任务中执行此代码时,OperationContext.Current 为空,是否可以在抽象程序集中解决这个问题,或者我们会需要向这个程序集的所有消费者添加一些代码吗?
问问题
1521 次
3 回答
3
面临着类似的问题。正在通过任务调用服务。下面的代码片段解决了。是通过在调用服务完成之前强制转换提供的变量来OperationContext.Current
显式设置的。state
Task
Task<int> taskContactsCount = Task.Factory.StartNew<int>((state) =>
{
int count = 0;
try
{
OperationContext.Current = (OperationContext)state;
TestServiceClient testServiceProxy = new TestServiceClient();
var count = testServiceProxy.GetCount();
}
catch (Exception ex)
{
}
return contactsCount;
}, OperationContext.Current);
于 2013-11-12T10:38:41.370 回答
2
在创建Task
实例时,您应该使用闭包,如下所示:
// The operation context.
OperationContext oc = OperationContext.Current;
Task t = Task.Factory.StartNew(() => {
// Do something with context here, it will be valid for
// the life of the operation.
};
您还可以调用带参数的重载并将StartNew
实例传入,在需要时在 中进行转换和使用,如下所示:state
OperationContext
Task
Task t = Task.Factory.StartNew(s => {
// s is an object, so need to cast here.
var oc = (OperationContext) c;
// Work with the OperationContext.
},
// Note, this is passed to the delegate through the 's' parameter.
OperationContext.Current);
请注意,在这两种情况下,OperationContext
这只会对操作的生命周期有益。操作的完成应该依赖于Task
.
如果您正在启动一个Task
将在操作完成后运行的,那么您应该将您需要的值从另一个结构中复制OperationContext
到另一个结构中并将它们传递给您Task
的处理。
于 2012-07-16T19:46:02.193 回答
0
似乎唯一的方法是向 CallContext 添加一些东西,就像存储当前的 Principal 一样......
于 2012-07-18T14:26:51.263 回答