私はASP.NETとF#を使用してWeb APIを構築しています。私はIExceptionHandlerの実装を持っています。IExceptionHandlerの実装がエラー応答を返さないのはなぜですか?
type DefaultExceptionHandler() =
let mapExceptionTypetoHttpStatusCode (ex:Exception) : HttpStatusCode =
match ex with
| :? ArgumentException -> HttpStatusCode.BadRequest
| _ -> HttpStatusCode.InternalServerError
interface IExceptionHandler with
member x.HandleAsync (context:ExceptionHandlerContext, cancellationToken:CancellationToken) =
let request = context.Request
let ex = context.Exception
let httpStatusCode = mapExceptionTypetoHttpStatusCode ex
context.Result <- { new IHttpActionResult with member x.ExecuteAsync(token:CancellationToken) = Task.FromResult(request.CreateErrorResponse(httpStatusCode, ex)) }
Task.FromResult(0) :> Task
起動時に登録されます。
type Global() =
inherit System.Web.HttpApplication()
static member RegisterWebApi(config: HttpConfiguration) =
// Configure routing
config.MapHttpAttributeRoutes()
config.Routes.MapHttpRoute(
"DefaultApi", // Route name
"api/{controller}/{id}", // URL with parameters
{ controller = "{controller}"; id = RouteParameter.Optional } // Parameter defaults
) |> ignore
config.Services.Replace(typeof<IExceptionHandler>, new DefaultExceptionHandler())
member x.Application_Start() =
GlobalConfiguration.Configure(Action<_> Global.RegisterWebApi)
私はデバッグし、コードが横断されていることがわかりますが、返された応答は、ハンドラで設定した応答ではありませんすることができます。私は見落としているものの、コンパイラのエラーを引き起こしていないものが簡単だと確信していますが、これまで問題を確認することはできませんでした。 context.Result
を正しく設定していませんか?
あなたのうちの一人F#gurusがすぐに自分のエラーを表示します。これまでに読んでいただきありがとうございます。
'Task.FromResult(0)'式が疑わしいと思われます。メソッドボディ全体をタスク内で実行しようとするか、より多くのF#nessに対して、 'async'ワークフローで実装し、それを戻り式として' Task'に変換してください。 –
同様の例として、これは役立つかもしれません:http://blog.ploeh.dk/2014/06/12/web-api-raygun-error-handler –
@MarkSeemann応答いただきありがとうございます。私は、私の問題を引き起こしていたものの詳細を以下に掲載しました。私は別の[質問](http://stackoverflow.com/questions/36699555/what-is-the-correct-way-to-return-an-empty-task-when-implementing-message-hand)を投稿しました。 'Task.FromResult(0)'の使用に関して発生した懸念に対処してください。このリンクをお寄せいただき、ありがとうございました.F#を使用した「Functional Architecture with F#」コースを発見しました。これは現在、私の待ち行列の最上部にあります。 – pluralMonad