ASP.NETとF#を使用してWebAPIを構築しています。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#の達人の1人がすぐに私のエラーを見るでしょう。ここまでお読みいただき、ありがとうございました。
さて、*問題*は(恥ずかしいほど)単純であることが判明しました。学習メカニズムとしてF#Web APIテンプレートを使用しているときに他の人が同様の問題に遭遇した場合に備えて、ここに投稿します。
これは、テンプレートの誤解から生じました。現在存在するテンプレートはindex.html
、プロジェクトルートにあるファイルを使用して、慣例により応答を配信します。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Car List App</title>
<link href="./Content/bootstrap.min.css" rel="stylesheet">
<link href="./Content/Site.css" rel="stylesheet">
</head>
<body>
<div class="container">
<h2 class="sub-header">All Cars</h2>
<table id="cars" class="table">
<thead>
<tr>
<td>#</td>
<td>Make</td>
<td>Model</td>
</tr>
</thead>
<tbody />
</table>
</div>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.0.3.min.js"></script>
<script src="./Scripts/main.js"></script>
内部から呼び出されるJavaScriptの中にindex.html
は、コントローラーへの呼び出しを実際に実行したものがあります。
$(function () {
var uri = 'api/cars';
$.getJSON(uri)
.done(function (data) {
$.each(data, function (key, item) {
$('<tr><td>' + (key + 1) + '</td><td>' + item.make + '</td><td>' + item.model + '</td></tr>')
.appendTo($('#cars tbody'));
});
});
});
JSは上記のプロパティを持つオブジェクトを予期しているため、エラー応答を受信すると、それを無視して空のindex.html
ページを表示しました。
ルーキー、間違い。うまくいけば、これは誰かの命を数分節約するでしょう。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加