2

私は Web API が初めてで、いくつかの API コントローラーの例外を試していました。ここでの私の問題は、例外がスローされたときです。アプリケーションは、スタックトレースと返されるモデルのいくつかのプロパティを含む情報を多すぎます。返される例外をメッセージだけに制限できるかどうか疑問に思っていましたか?

次に例を示します。

public IEnumerable<Appointments> GetAll(int id)
{
    IEnumerable<Appointments> appointments = icdb.Appointments.Where(m => m.Id== id).AsEnumerable();
    return appointments;
}

これが例外 (差分の問題) を返す場合、次のようなものが返されます。

{"メッセージ":"エラーが発生しました。","ExceptionMessage":"'ObjectContent`1' タイプは、コンテンツ タイプ 'application/json; charset=utf-8' の応答本文をシリアル化できませんでした。","ExceptionType ":"System.InvalidOperationException","StackTrace":null,"InnerException":{"メッセージ":"エラーが発生しました。","ExceptionMessage":"タイプ 'System. Data.Entity.DynamicProxies.User_B23589FF57A33929EC37BAD9B6F0A5845239E9CDCEEEA24AECD060E17FB7F44C'. パス '[0].UpdateBy.UserProfile.UpdateBy.UserProfile'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":........ ...................................: : : }

お気づきのとおり、モデルのほとんどのプロパティを含むスタック トレースが返されます。例外がスローされたときにメッセージを返す方法はありますか?

4

1 に答える 1

2

APIコントローラーがあると言いました。エラーが発生した場合は、次のようにする必要があります。

// A handled exception has occurred so return an HTTP status code
return Request.CreateResponse<string>(HttpStatusCode.BadRequest, your_message);

したがって、指定されたサンプル コードでは、次のようなものを使用できます。

public IEnumerable<Appointments> GetAll(int id)
{
    IEnumerable<Appointments> appointments= null;
    try {
        icdb.Appointments.Where(m => m.Id== id).AsEnumerable();
    }
    catch {
        var message = new HttpResponseMessage(HttpStatusCode.BadRequest);
        message.Content = new StringContent("some custom message you want to return");
        throw new HttpResponseException(message);
    }
    return appointments;
}

コントローラーで未処理の例外が発生した場合、呼び出し元のコードは 500 ステータスを受け取ります。

于 2013-03-28T04:23:38.687 に答える