私はASP.NET Web APIを開発しています。コントローラのアクションの1つでTask.Factory.StartNew呼び出しを使用します。Task.Factory.StartNewを使用してExceptionFilterAttributeがトリガーされない
ただし、タスク内で例外がスローされたときに設定した例外フィルタはトリガされません。
Controller.cs
public class MyController : ApiController
{
[HttpPost]
public HttpResponseMessage Post()
{
Task.Factory
.StartNew(() => DoTheThing())
.ContinueWith(tsk => { throw new Exception("Webhook Exception", tsk.Exception); }, TaskContinuationOptions.OnlyOnFaulted);
return new HttpResponseMessage(HttpStatusCode.OK);
}
}
ExceptionFilter.cs
public class ExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new ObjectContent(typeof(object), new
{
Message = "Critical Error",
ExceptionMessage = "An error occurred, please try again or contact the administrator.",
Type = ExceptionType.Unhandled
}, new JsonMediaTypeFormatter()),
ReasonPhrase = "Critical Error"
});
}
}
Global.asax.cs
public class MyApplication : HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configuration.Filters.Add(new ExceptionFilter());
}
}
Iデバッグでき、ContinueWithメソッドがトリガされ、新しいExceptionがスローされます。しかし、フィルターはトリガーされません。
あなたは(再)「例外」を観察しているわけではないので、「観察されない例外」です。参照:[.NET 4.5のタスク例外処理](https://blogs.msdn.microsoft.com/pfxteam/2011/09/28/task-exception-handling-in-net-4-5/) – IronGeek
ありがとうリンク、私は今問題を理解すると思います。私はフィルタが自分のアクションで例外をキャッチするので、私は不可能にしようとしています。しかし私は自分の仕事が終わる直前に私の行動が戻るようにしたい。 – Joe