您必须自己添加 AuthenticateRequest 的异步版本。使用以下代码:
public MvcApplication()
{
// Contrary to popular belief, this is called multiple times, one for each 'pipeline' created to handle a request.
// Wire up the async authenticate request handler.
AddOnAuthenticateRequestAsync(BeginAuthenticateRequest, EndAuthenticateRequest, null);
}
接下来的问题是,如何使用 C# 的新 async/await 特性来实现 BeginAuthenticateRequest 和 EndAuthenticateRequest。首先,让我们把异步版本的 AuthenticateRequest 去掉:
private async Task AuthenticateRequestAsync(object sender, EventArgs args)
{
// Yay, let's do async stuff!
await ...
}
接下来我们需要做的是提出 BeginAuthenticateRequest 和 EndAuthenticateRequest 的实现。我关注a blog post,但衍生出我自己的实现:
private IAsyncResult BeginAuthenticateRequest(object sender, EventArgs args, AsyncCallback callback, object state)
{
Task task = AuthenticateRequestAsync(sender, args);
var tcs = new TaskCompletionSource<bool>(state);
task.ContinueWith(_ =>
{
if (task.IsFaulted && task.Exception != null) tcs.TrySetException(task.Exception.InnerExceptions);
else if (task.IsCanceled) tcs.TrySetCanceled();
else tcs.TrySetResult(true);
if (callback != null) callback(tcs.Task);
}, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default);
return tcs.Task;
}
您可以阅读整个链接文章以了解其工作原理,但基本上IAsyncResult 是由Task 实现的,因此您只需在完成后调用回调即可。
最后一点很简单:
private void EndAuthenticateRequest(IAsyncResult result)
{
// Nothing to do here.
}