在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);
}
答案 0 :(得分:2)
您无需使用异步IOperationInvoker
。您可以使用同步操作,但仍然具有异步操作。这可能是最简单的行动方式。
如果您想要异步,则需要使用IAsyncResult
返回的_defaultInvoker.InvokeBegin(instance, inputs, callback, state);
。现在,这个价值再也没有看过了。
使用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
。