28

ローカルおよびテスト サーバーで正常に動作する Web API コントローラーの POST メソッドがあります。すべてがうまくいくと、次のように返されます。

new HttpResponseMessage( HttpStatusCode.Created )

何か問題が発生した場合は、次を返します。

new HttpResponseMessage<IEnumerable<string>>( usefulMessages, HttpStatusCode.BadRequest );

問題は、エラーが発生するテスト サーバーにリクエストを送信すると、不正なリクエスト コードが返されますが、メッセージが表示されないことです。ローカル マシンに対してまったく同じ要求を行うと、メッセージが表示されます。次の出力は、私自身のツールからのものです。

ローカル マシンにリクエストを送信すると、次のようになります。

Status code: 400 (BadRequest)
Response data: ["Error message one", "Error message two"]

テストサーバーにリクエストを送信すると、次のようになります。

Status code: 400 (BadRequest)
Response data: Bad Request

実行中のコードはまったく同じです。データベースは同じです。リクエストを処理するサーバーを除いて、すべて同じです。エラー メッセージを自分宛てに電子メールで送信するコードさえあるので、サーバーが正しいエラー メッセージを生成し、正しく動作していることがわかります。これは IIS の問題でしょうか (Web API の customErrors = RemoteOnly に相当するものなど)? 応答データからエラー メッセージが省略されるだけでなく、代わりに「Bad Request」というフレーズを作成します。

何か案は?ありがとう。

4

5 に答える 5

29

HttpConfiguration.IncludesErrorDetailPolicy に関するこの MSDN の投稿を見てください。

Global.asax で:

var config = GlobalConfiguration.Configuration;
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

この構成プロパティを使用して、エラー メッセージに詳細を含めるよう強制しました。

于 2012-05-03T17:46:19.027 に答える
18

同じ問題がありました。それは確かにカスタムエラー設定が原因です。

実際のシナリオでは、アプリケーションでカスタム エラー ページを使用することは間違いありませんが、カスタム例外メッセージを WebAPI で機能させるには、カスタム エラー ページを無効にする必要があります。

これを修正する方法は?幸いなこと<location>に、web.config の要素を使用してこれを解決できます。

解決:

  <!-- General for the application -->
  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="YourCustomErrorPage.aspx"/>
  </system.web>

  <!-- Override it for paths starting with api (your WebAPI) -->
  <location path="api">
     <system.web>
        <customErrors mode="Off" />
     </system.web>
  </location>

私は自分のアプリでこの方法を使用していますが、うまくいきます。

于 2014-05-12T13:50:29.393 に答える
4

それは私にとってあなたのcustomErrorsモードである可能性が非常に高いようです。WebAPI は ASP.NET (MVC) 上で実行されるため、すべて同じ web.config 設定を使用します。

テスト サーバーの場合は、customErrors をオフにして検証することができます。

<system.web>
    <customErrors mode="Off" />
</system.web>
于 2012-04-24T17:52:35.810 に答える
1

ベータ版以降、Web API コード ベースには多くの変更が加えられています。すごさいっぱい。夜間に署名されたビルドを取得する方法については、こちらを参照してください。

ジェネリックHttpResponseMessage<T>はサポートされなくなりました。を使用しHttpRequestMessage.CreateResponse<T>ます。これこれを参照してください。

今後もベータ版を使用する予定がある場合は、ベータ版を使用する代わりに、少なくとも現在のナイトリー ビルドに更新することをお勧めします。特に Web API に関しては、非常に多くの優れた改善が行われています。

編集:私の考えでは、これは実際には元の質問に関連していました。具体的な回答を調べていませんが、新しいものは IIS によって傍受されない応答を返すようです。エラー処理/エラー報告のやり直しに関係している可能性があります。

UPDATE 8/14/2012 MVC 4 / Web API の現在のリリース候補版で十分です。完全に最新の状態に保ちたい場合を除き、ナイトリー ビルドを取得する必要はもうありません。

于 2012-05-15T14:15:20.933 に答える