【发布时间】:2015-10-18 21:20:51
【问题描述】:
我经过 6 年的开发后的第一个问题,所以……大家好。 我到处搜索有关此主题的信息,但没有任何帮助。
我已将控制器的所有方法从同步转移到异步。在一切正常之前,当抛出异常时,会触发 OnException 方法。
现在,当异步控制器方法中引发异常时,无法触发 OnException 或 OnExceptionAsync 方法。
这是我的代码
public class ExceptionHandlerFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
var resp = new HttpResponseMessage();
resp.Content = new StringContent(context.Exception.Message + Environment.NewLine + Environment.NewLine + context.Exception.StackTrace);
if (context.Exception is NotImplementedException)
resp.StatusCode = HttpStatusCode.NotImplemented;
else if (context.Exception is NotFoundException)
resp.StatusCode = HttpStatusCode.NotFound;
else if (context.Exception is ArgumentException)
resp.StatusCode = HttpStatusCode.BadRequest;
else
resp.StatusCode = HttpStatusCode.InternalServerError;
context.Response = resp;
}
public override Task OnExceptionAsync(HttpActionExecutedContext context, CancellationToken cancellationToken)
{
var task = base.OnExceptionAsync(context, cancellationToken);
return task.ContinueWith((t) =>
{
var resp = new HttpResponseMessage();
resp.Content = new StringContent(context.Exception.Message + Environment.NewLine + Environment.NewLine + context.Exception.StackTrace);
if (context.Exception is NotImplementedException)
resp.StatusCode = HttpStatusCode.NotImplemented;
else if (context.Exception is NotFoundException)
resp.StatusCode = HttpStatusCode.NotFound;
else if (context.Exception is ArgumentException)
resp.StatusCode = HttpStatusCode.BadRequest;
else
resp.StatusCode = HttpStatusCode.InternalServerError;
context.Response = resp;
});
}
}
这是我的控制器
[ExceptionHandlerFilter]
public class FascicolazioneController : ApiController
{
[ActionName("ClassificaFascicolaArchivisticamente")]
[HttpPost]
public async void ClassificaFascicolaArchivisticamente(string progressivoAnnuo, string archivio, int fascicoloId, string classificazione)
{
try
{
throw new NotImplementedException();
}
catch (Exception ex)
{
throw ex;
}
using (var client = new Cad.BDI.Archiflow.FacadeArchiflow("SUPER", this.GetTypeAndMethodName()))
{
await Task.Factory.StartNew(() => client.ClassificaFascicolaArchivisticamente(
ProgressivoAnnuo.Parse(progressivoAnnuo), archivio, fascicoloId, Classificazione.Parse(classificazione)));
}
}
我尝试在 WebApiConfig 和/或 global.asax 中设置正确的代码行,添加 ExceptionHadlerFilter 而不是仅在控制器上设置属性,但没有任何帮助
【问题讨论】:
-
在创建回复后尝试将呼叫转移到
base.OnExceptionAsync。另外,不要使用ContinueWith,如果需要使用async-await。将缩短您的代码并使其更具可读性。 -
谢谢,但它不起作用。奇怪的是,当同步控制器方法出现异常时,会触发 OnExceptionAsync !但是异常过滤器类上的异步控制器方法不会触发任何内容。不明白为什么......
标签: c# asynchronous asp.net-web-api error-handling async-await