74

正如标题所说,我从 GET 请求到 IQueryable 操作有 500 内部服务器错误。错误正文为空。该错误发生在我的操作返回结果之后。

我使用 ASP.NET Web API RC。

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

4

10 回答 10

60

您可以尝试添加:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
    IncludeErrorDetailPolicy.Always;

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

但是,如果您没有得到令人满意的信息,您应该考虑编写一个 l异常过滤器并在全局范围内注册它。

这篇文章应该让你开始。您需要的核心是编写和注册以下内容:

public class NotImplExceptionFilter : ExceptionFilterAttribute {
  public override void OnException(HttpActionExecutedContext context) {
     if (context.Exception is NotImplementedException) {
       context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
    }
  }
}
于 2012-06-08T19:29:05.660 回答
9

发布 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();
于 2012-06-12T20:59:23.330 回答
4

我遇到了同样的问题。我发现Kiran Challa 的回应有助于让实际异常被抛出我的行动之外。

为了解决我的问题,将上下文的 ProxyCreationEnabled 属性设置为 false让我更进一步。

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

于 2012-07-03T20:05:10.417 回答
4

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

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

    public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Default is required in any case.
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
于 2015-12-18T09:12:22.487 回答
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;
于 2014-01-17T18:38:37.330 回答
2

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

于 2012-06-19T00:52:37.507 回答
2

这个场景是由于以下原因引起的

  1. 该问题是由于 Web.config 格式错误而发生的。(多个配置部分)

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

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

并且不要忘记添加

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

到 Web.config

于 2017-04-07T04:39:20.783 回答
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;
}
于 2012-10-13T21:09:36.450 回答
1

我有同样的问题,但它的来源略有不同:我设置的CORS策略不正确,这给了我500 Internal server error,但由于CORS不起作用,Access-Control-Allow-Origin标题没有在响应中显示,浏览器无法读取实际响应

我使用 ChromeDevTools 选项解决了这个问题,Copy as cURL这让我可以看到响应并了解错误来源

于 2016-05-20T08:34:56.420 回答
0

Fredrik Normén 就该主题写了一篇很棒的博客文章,名为ASP.NET Web API 异常处理。他的解决方案使用自定义异常类和可应用于所有ApiController操作方法的异常过滤器属性。

于 2012-06-22T13:26:43.890 回答