在WCF中,通过实现IOperationInvoker,我试图在调用实际方法之前测试调用者是否获得授权。但是我想以异步的方式来做,因为我的方法都是异步的。问题是我不知道如何将Task和IAsyncResult结合在一起。在InvokeBegin中,我首先要检查授权,然后返回原始方法的调用。我的AauthorizeAsync方法定义如下:
private static async Task<bool> AauthorizeAsync(string[] claims)我做了这样的事情,但在异常情况下,执行不会继续,似乎调用线程没有收到任何反馈,并保持孤立状态。
public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
return AauthorizeAsync(_claims)
.ContinueWith(task =>
{
var authorized = task.Result;
if (!authorized)
{
throw new WebFaultException(HttpStatusCode.Unauthorized);
}
return _defaultInvoker.InvokeBegin(instance, inputs, callback, state);
});
}工作代码是这样的,但它是同步的。如何将其转换为完全异步?
public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
var authorized = AauthorizeAsync(_claims).GetAwaiter().GetResult();
if (!authorized)
{
throw new WebFaultException(HttpStatusCode.Unauthorized);
}
return _defaultInvoker.InvokeBegin(instance, inputs, callback, state);
}
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
return _defaultInvoker.InvokeEnd(instance, out outputs, result);
}发布于 2015-08-07 18:51:21
您不需要使用异步IOperationInvoker。您可以使用同步操作,但仍然可以使用异步操作。这可能是最简单的行动方案。
如果你想要一个异步的,你需要使用_defaultInvoker.InvokeBegin(instance, inputs, callback, state);返回的IAsyncResult。现在,这个值再也不会被查看了。
使用Task.FromAsync从它创建任务。然后,您可以返回该任务并调用Unwrap。如果你使用await,那就更简单了。ContinueWith应该是一种代码味道。
var authorized = await AauthorizeAsync(_claims);
if (!authorized)
{
throw new WebFaultException(HttpStatusCode.Unauthorized);
}
await Task.FromAsync(..., _defaultInvoker.InvokeBegin(instance, inputs, callback, state), ...);这必须在新的async方法中。然后,生成的任务可以充当包含所有内容的IAsyncResult。
https://stackoverflow.com/questions/31873187
复制相似问题