3

簡単なユーザー登録を処理するための MSMVC API を作成しています。API では、コントローラーに渡されたデータが無効な場合に例外をスローしたいと考えています。

    public XmlResult RegisterByEmailAddress(UserModel model)
    {
        var errorResponse = new HttpResponseMessage(HttpStatusCode.BadRequest)
        {
            Content = new StringContent("Problem"),
            ReasonPhrase = "Problem"
        };
        throw new HttpResponseException(errorResponse);
    }

ただし、例外に設定した内容に関係なく、クライアントの応答に 500 エラーしか表示されません。私は Visual Studio 2012 を使用しており、ローカル IIS サーバーで API をデバッグ モードで実行しています。

Chrome Dev に表示される応答の実際の内容は次のとおりです。

メソッド: Get、ステータス: 500 内部サーバー エラー、タイプ text/html

問題が何であるか誰にも分かりますか?

4

5 に答える 5

4

あなた自身の答えと、私が行ったいくつかのテストに基づいて、コントローラーが間違った基本クラスから継承していると思います。コントローラーの残りの部分を投稿すると、見やすくなる場合があります。

すべての API コントローラーは ApiController から継承する必要があります

MyController : ApiController
于 2013-08-15T09:27:56.770 に答える
1

OK、多くの試行錯誤の末、次のように動作します:

throw new HttpException((int)HttpStatusCode.BadRequest, "Invalid password provided to the Api");

これは、Api の開発時に HttpResponseException をスローすることを推奨している (私が思うに) ドキュメントに反しているようです。

于 2013-08-14T22:12:31.070 に答える
0

私は似たようなことをしていますが、拡張された ExceptionFilterAttribute で行っています。それができるかどうかはわかりませんが、私が現在使用しているコードを共有することを考えました. これは単なるサンプルです。このメソッドに追加することがたくさんあるので。

public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
    var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
    var controllerName =
        actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
    Logger.LogException(controllerName + ":" + actionName, actionExecutedContext.Exception);
    actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
                                         {
                                             ReasonPhrase = YourPhrase
                                         };
}
于 2013-08-12T11:44:12.617 に答える