ASP.NET Web API:非描述性500内部服务器错误

时间:2012-06-08 07:47:27

标签: exception-handling asp.net-web-api

正如标题所说,我从GET请求到IQueryable操作有500个内部服务器错误。错误的主体是空的。我的操作返回结果后发生错误。

我使用ASP.NET Web API RC。

如何获得该错误的堆栈跟踪?

10 个答案:

答案 0 :(得分:56)

您可以尝试添加:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
    IncludeErrorDetailPolicy.Always;

到Global.asax中的Application_Start()。此解决方案适用于许多常见错误。

但是,如果您没有获得满意的信息,则应考虑编写l 例外过滤器并在全球范围内注册。

This article应该让你入门。你需要的核心是写作&注册如下:

public class NotImplExceptionFilter : ExceptionFilterAttribute {
  public override void OnException(HttpActionExecutedContext context) {
     if (context.Exception is NotImplementedException) {
       context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
    }
  }
}

答案 1 :(得分:8)

发布RC后,此问题已修复,除了500内部服务器错误之外,您还将收到错误详细信息。 (此问题仅针对Web主机方案修复)。

您可以执行以下操作来获取格式化程序的WriteToStream方法中可能发生的实际异常的详细信息。

ObjectContent<IEnumerable<Product>> responseContent = new ObjectContent<IEnumerable<Product>>(db.Products.Include(p => p.ProductSubcategory).AsEnumerable(), new XmlMediaTypeFormatter()); // change the formatters accordingly

            MemoryStream ms = new MemoryStream();

            // This line would cause the formatter's WriteToStream method to be invoked.
            // Any exceptions during WriteToStream would be thrown as part of this call
            responseContent.CopyToAsync(ms).Wait();

答案 2 :(得分:4)

我遇到了同样的问题。我发现Kiran Challa's response有助于在实际操作之外抛出实际异常。

为解决我的问题,setting the ProxyCreationEnabled property of my context to false让我更进了一步。

在我的场景中,我的下一个例外是由于模型中的循环引用。清理完之后,幻影500的响应消失了。祝你好运,如果你还没有解决这个问题!

答案 3 :(得分:3)

这可能与循环参考有关。

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#handling_circular_object_references

尝试将以下代码添加到Global.asax文件中的Application_Start方法:

 var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
 json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;

答案 4 :(得分:3)

在我的案例中,一个欺骗性的简单路由弱点导致了这个问题:在我的Api控制器中有另一个具有相同签名(不是名称)的HttpPost。默认路由不解析名称差异,ServiceError 500是在达到任一Api函数之前给出的响应。解决方案:更改默认路由或签名,然后重试。

这是我的RouteConfig.cs,它非常适用于标准的WebApi2用法:

ObservableCollection<string>

答案 5 :(得分:2)

当我没有按正确的顺序指定查询参数时,我在RC中遇到了问题。例如,如果您指定$skip=0,它将获得500,但如果您指定$orderby=xxx&skip=0则没有错误。

答案 6 :(得分:2)

此场景是由于以下原因造成的

  1. 由于Web.config格式错误而导致出现问题。 (多个configSections)

  2. 我没有在 bin 文件夹中创建 roslyn 文件夹,而是在根目录创建了它。 (部署地点。)

  3. 诊断这个问题的最佳方法是,在应用程序位置放置一个简单的HTML页面并尝试浏览它。 500错误描述将​​显示在此html页面上。

    也不要忘记添加

      

    <customErrors mode="Off"></customErrors>

    到Web.config

答案 7 :(得分:1)

我通常使用Global.asax来捕获所有错误。这是您可以使用的代码片段

public void Application_Error(object sender, EventArgs e)
{
  Exception exc = Server.GetLastError();
  MvcApplication mvcApplication = sender as MvcApplication;
  HttpRequest request = null;
  if (mvcApplication != null) request = mvcApplication.Request;
}

答案 8 :(得分:1)

我遇到了同样的问题,但它的来源略有不同: 我错误地设置了Source.tick(...).map(loadFromMongo)政策,这给了我CORS,但由于500 Internal server error无效,CORS标题未作为回复显示,浏览器无法读取实际回应

我使用ChromeDevTools选项Access-Control-Allow-Origin解决了这个问题,它允许我查看响应并了解错误来源

答案 9 :(得分:0)

FredrikNormén撰写了一篇名为ASP.NET Web API Exception Handling的精彩博文,内容涉及该主题。他的解决方案使用自定义异常类和可应用于所有ApiController操作方法的异常过滤器属性。