0

私はこれに2日間苦労しています。それはとても落胆します。

これは比較的単純な API コントローラーです。

[HttpPost]
public HttpResponseMessage Save(ReportCreateInputModel model)
{
    if (ModelState.IsValid)
    {                
        _service.AddReport(model);

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, model);
        return response;
    }
    else
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }
}

localhost:xxxx でデバッグすると、すべて正常に動作します。モデルは有効で、新しいレコードをデータベースに挿入できます。

しかし、サーバーに公開されると、常に400: Bad Request. 別のブラウザを試してみましたが、サーバー側の問題であると確信しています。

次に、他の投稿で述べたように、リクエスト サイズを増やしてみました。しかし、それでもうまくいきません。そのサーバーにリモート デバッグ ツールをインストールできませんでした。

誰もこの問題を見たことがありますか?それはIIS 6で何かありますか?

どんな援助でも本当に感謝します。ありがとうございました!


アップデート:

Bad Requestエラーがスローされる前に api POST アクションがヒットすることはありません。しかし、なぜローカル デバッグで問題ないのでしょうか。


アップデート:

これらのコード行を WebApiConfig.cs に追加しました

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
    Newtonsoft.Json.PreserveReferencesHandling.Objects;
json.SerializerSettings.ReferenceLoopHandling =
    Newtonsoft.Json.ReferenceLoopHandling.Ignore;
config.Formatters.Remove(config.Formatters.XmlFormatter);

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

今、jqXHR.responseText私には例外があります

"$id":"3","Message":"An error has occurred.",
"ExceptionMessage":"This operation requires IIS integrated pipeline mode.",
"ExceptionType":"System.PlatformNotSupportedException",
"StackTrace":" at System.Web.HttpContext.get_CurrentNotification()
               at System.Web.HttpContextWrapper.get_CurrentNotification()
               at GetCurrentNotification(Object )
               at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)"

わお!私が使用しているIIS 6と関係がありますか? その StackTrace が何であるかを誰が教えてくれますか? ありがとう。


ここget_CurrentNotificationで、IIS7 にのみ存在するパイプラインが必要であることがわかりました。しかし、私がどこに電話をかけたかを誰が教えてくれHttpContext.CurrentNotificationますか?

4

1 に答える 1

0

代わりにコードを次のように変更して、不正なリクエストを受け取る理由を確認してください。

return Request.CreateResponse(HttpStatusCode.BadRequest, ModelState);

無効な ModelState が原因で 400 を返す場合は、常に応答に ModelState を含める必要があります。そうすれば、クライアントはリクエストの何が問題なのかについての情報を得ることができます。

また、可能であれば、デバッグのためだけに、構成でこれを行うことにより、IncludeExceptionDetails を常に有効にします。そうすれば、400 エラー応答で詳細を取得できます。

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

本番サーバーでのデバッグの場合のみ、常に IncludeExceptionDetails を使用する必要があることに注意してください。そうしないと、サービスにアクセスできるすべての人にセキュリティ上の機密情報が漏洩することになり、これは悪いことです。

于 2013-08-13T17:59:02.697 に答える