0

我已经为此苦苦挣扎了两天。这太令人沮丧了。

是一个比较简单的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 回答