C# ASP.NET MVC中的异步错误控制器

C# ASP.NET MVC中的异步错误控制器,c#,asp.net-mvc,asp.net-mvc-4,asynchronous,error-handling,C#,Asp.net Mvc,Asp.net Mvc 4,Asynchronous,Error Handling,有人能帮我弄一个在ASP MVC中工作的异步错误控制器吗。我让它在不异步的情况下工作,但这似乎不正确。我开始使用的代码如下: void Application_Error(object sender, EventArgs e) { Exception exception = Server.GetLastError(); // A good location for any error logging, otherwise, do it inside of the

有人能帮我弄一个在ASP MVC中工作的异步错误控制器吗。我让它在不异步的情况下工作,但这似乎不正确。我开始使用的代码如下:

void Application_Error(object sender, EventArgs e)
{
        Exception exception = Server.GetLastError();

        // A good location for any error logging, otherwise, do it inside of the error controller.

        // Clear the error, otherwise, we will always get the default error page.
        Server.ClearError();
        Response.Clear();
        Response.TrySkipIisCustomErrors = true;

        var code = (exception is HttpException) ? (exception as HttpException).GetHttpCode() : 500;

        var routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("action", "index");
        IController errorController = ClassFactory.Resolve<ErrorController>();
        errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
如果我将错误控制器方法设为异步,则Application_error中的Execute方法会引发异常。异步操作方法“index”返回一个无法同步执行的任务

我最有希望的尝试之一就是转移请求。这在应用程序错误方法中使用了以下代码:

var code = (exception is HttpException) ? (exception as HttpException).GetHttpCode() : 500;
var headers = new NameValueCollection
{
    {"ErrorUrl", Context.Request.RawUrl},
    {"ErrorCode", code.ToString()}
};
Context.Server.TransferRequest("~/error", false, null, headers, true);
这在异步情况下运行良好,我可以在请求头中传递错误数据。不幸的是,Server.TransferRequest调用丢失了有关当前登录用户的详细信息,该用户将在错误页面上显示为已注销。用户登录代码当前与VS2013模板的登录代码相同,而不是旧的forms auth。preserveUser参数似乎不起作用

有人让这样的异步控制器工作吗

有人知道如何解决ASP身份在传输请求时丢失的问题吗


相关问题包括,哪种解决方案比不同时使用两个线程的异步更糟糕。还有一个被回答的问题,但没有TransferRequest。

Context.Server.TransferRequest是解决问题的正确方法。此函数通过整个IIS管道发送以下请求。我丢失ASP标识的原因是它存储在会话中。会话使用cookie链接到客户端。Cookie在标题中

而不是代码:

var code = (exception is HttpException) ? (exception as HttpException).GetHttpCode() : 500;
var headers = new NameValueCollection
{
    {"ErrorUrl", Context.Request.RawUrl},
    {"ErrorCode", code.ToString()}
};
Context.Server.TransferRequest("~/error", false, null, headers, true);
我已将其用于:

var code = (exception is HttpException) ? (exception as HttpException).GetHttpCode() : 500;
var headers = Request.Headers;
headers.Add(new NameValueCollection
{
    {"ErrorUrl", Context.Request.RawUrl},
    {"ErrorCode", code.ToString()}
});
Context.Server.TransferRequest("~/error", false, null, headers, true);

主要的区别是我正在传递当前请求的头,其中包含cookies,它链接到会话。这将阻止ASP.NET标识丢失。

而不是代码:

var code = (exception is HttpException) ? (exception as HttpException).GetHttpCode() : 500;
var headers = new NameValueCollection
{
    {"ErrorUrl", Context.Request.RawUrl},
    {"ErrorCode", code.ToString()}
};
Context.Server.TransferRequest("~/error", false, null, headers, true);
我已将其用于:

var code = (exception is HttpException) ? (exception as HttpException).GetHttpCode() : 500;
var headers = Request.Headers;
headers.Add(new NameValueCollection
{
    {"ErrorUrl", Context.Request.RawUrl},
    {"ErrorCode", code.ToString()}
});
Context.Server.TransferRequest("~/error", false, null, headers, true);

主要的区别是我正在传递当前请求的头,其中包含cookies,它链接到会话。这将阻止ASP.NET标识丢失。

您可以发布控制器方法吗?也许可以使它完全不异步,我可以让控制器在没有异步的情况下工作,但最好让所有东西都异步。错误控制器需要DB访问权限来建议可能的页面,并可能将用户重定向到正确的页面。如果控制器只显示视图,则它不应该是异步的。Async用于i/o操作,我在上面的注释中提到错误控制器需要DB访问。这是检索视图数据和/或重定向到哪个页面所必需的。数据库访问是异步操作非常有用的一个很好的例子。我可能没有注意到这一点,但如果你找到了解决方案,那就太酷了!你能发布你的控制器方法吗?也许可以使它完全不异步,我可以让控制器在没有异步的情况下工作,但最好让所有东西都异步。错误控制器需要DB访问权限来建议可能的页面,并可能将用户重定向到正确的页面。如果控制器只显示视图,则它不应该是异步的。Async用于i/o操作,我在上面的注释中提到错误控制器需要DB访问。这是检索视图数据和/或重定向到哪个页面所必需的。数据库访问是异步操作非常有用的一个很好的例子。我可能没有注意到这一点,但如果你找到了解决方案,那就太酷了!第二个参数是preserveForm,它在我的例子中设置为true很有用-值得注意第二个参数是preserveForm,它在我的例子中设置为true很有用-值得注意