2016-06-23 8 views
1

I持って、次の一般構造を有しているASP.NET WebAPIの(V2)コントローラのアクション: WebAPIのBadRequestドロップ応答データ

[HttpPost] 
public HttpResponseMessage Post(UserDTO model) 
{ 
    try { 
     // do something 
    } 
    catch (Exception ex) 
    { 
     var error = new { 
      errorMessage = ex.Message, 
      userId = 123, 
      // some other simple data 
     }; 
     return Request.CreateResponse(HttpStatusCode.BadRequest, error); 
    } 

    return Request.CreateResponse(HttpStatusCode.OK, model); 
} 

私はローカルの開発サーバー上でこれを実行する

IIS Expressの )、エラーがスローされると、JSONペイロードが返されます。
{ 
    config: {...}, 
    data: { 
     errorMessage: "User invalid", 
     userId: 123, 
     ... 
    }, 
    status: 400, 
    statusText: "Bad Request" 
} 

私は同じコードを実行

は/リモート/プロダクション・サーバ上のデータは、(8.5 IIS)、すべては私が帰ってもらう:

{ 
    config: {...}, 
    data: "Bad Request, 
    status: 400, 
    statusText: "Bad Request" 
} 

dataペイロードが失われたカスタム/から剥がさ応答。このは、私がHttpStatusCode.BadRequestからHttpStatusCode.OKに変更した場合と同様に、Request.CreateResponse()コールで使用されるHttpStatusCodeに関連すると表示され、カスタムデータペイロードがダウンロードされます。

私がテストしたところでは、返品をRequest.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);に変更しようとしましたが、結果は同じです。すなわち、データは単純な"Bad Request"文字列として返されました。

参照のため、APIはAngularJS $http.post()呼び出しによって呼び出されています。

HttpStatusCodeの変更により、本番サーバー上の応答ペイロードがローカルではなく変更されるのはなぜですか?どんな助けでも大歓迎です。

+0

申し訳ありませんが、私は尋ねる必要がありますが、この例外からの応答は確実ですか? IISとExpressは異なるプロセススタックを持っているため、例外は他の場所からのものです。 IISで、失敗した要求トレースを有効にして、例外ポイントを見つけるのを助けてください –

+0

もしそれがダムならば、私は自分自身に同じことを尋ねました:-)はい、私はそうだと思いますが...プロダクションWebサイトで使用されるエラー処理。 からを削除すると、データが正しく返されます。ですから、これはMVC/WebAPIの混在アプリケーションなので、WebAPI呼び出しのデフォルトのエラーハンドラを呼び出すのを避けるにはどうすればいいのでしょうか? – Neilski

答えて

1

これはWeb.configファイルにダウンし、次のセクションにいたが判明し

これらのページはなく、それらの除去、API呼び出しで、APIの呼び出しによって返されませんでしたので、それは奇妙な 'でした
<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="403" /> 
     <error statusCode="403" responseMode="ExecuteURL" 
       path="/Error/AccessDenied" /> 
     <remove statusCode="404" /> 
     <error statusCode="404" responseMode="ExecuteURL" 
       path="/Error/NotFound" /> 
     <remove statusCode="500" /> 
     <error statusCode="500" responseMode="ExecuteURL" 
       path="/Error/ApplicationError" /> 
    </httpErrors> 
</system.webServer> 

正しいペイロードを返しました - おそらくHttpStatusCode.BadRequestがどこかのエラーハンドラによって傍受されて元の応答データが失われていたでしょうか? by ubik404 hereが説明するように、私は削除これらのハンドラで

は、私がGlobal.asaxのApplication_Errorハンドラを使用してに頼っ。

同じ結果を得るためには、より良い/代替の方法があるかもしれませんが、これはうまくいくようです。

関連する問題