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


73

如标题所示,从GET请求到IQueryable操作,我收到了500个内部服务器错误。错误的主体为空。该错误在我的操作返回结果后发生。

我使用ASP.NET Web API RC。

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


2
培拉特,正如我所说,异常发生我的操作返回结果之后。我认为这是在Web Api尝试序列化我的收藏集时发生的。但是我不想假设,我想确切地知道正在发生什么。
奇怪的2012年

我已经将其视为旧版本之一中的已知问题。您使用的是Beta还是RC?
Aliostad

1
@ stever-b我在Global.asax中清除了xml格式化程序。但是在我的情况下,xml格式化程序正确地序列化了实体。我可以通过浏览器中的GET看到它。WebAPI选择了从jquery中使用getJSON生成JSON格式的结果,我猜这是出问题的地方。
奇怪的2012年

4
这是RC中的错误。远程请求URI时,无法在响应内容中返回错误(异常消息)。内容长度始终为零。我同时尝试了IncludeErrorDetailPolicy和重写ExceptionFilterAttribute OnException,但是无论将web.config中的customerror设置为“ Off”,它都无法远程工作。当我在远程服务器上使用rdp并仅使用IncludeErrorDetailPolicy设置在本地主机上发出请求时,出现了异常。因此,很不幸,我相信您还无法获得错误的堆栈跟踪信息。
cleftheris 2012年

1
@sham是的,我已切换到Java技术栈
2017年

Answers:


9

RC后,此问题已修复,除了500 Internal Server Error之外,您还将获得错误详细信息。(尽管此问题仅在Web Host场景中得到修复)。

您可以执行以下操作来获取格式化程序的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();

谢谢。将其添加到动作中,然后设置一个断点是我看到异常的唯一方法。干杯!
asgeo1 2012年

2
所以它不是针对自托管的?
JefClaes

2
邮政RC还没发布吗?除非您从源头构建?
JefClaes

59

您可以尝试添加:

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);
    }
  }
}

1
@EBarr在发布问题之前,我已经尝试过了。我在这里看到了您的答案stackoverflow.com/questions/10487943/…某种程度上它不起作用。我的错误500仍然是空的。我使用了Chrome中的“网络”标签来查看服务器的答案。
奇怪的2012年

1
@Oddy-当以上操作失败时,我还没有找到调试的好方法。当您的操作返回后发生错误时,我会看到一些途径-1)上面的方法,2)您的返回是执行错误查询的IEnumerable。尝试使用a.ToList()来检查查询,3)禁用或调试任何消息处理程序的第二部分(该ContinueWith()部分),或3)输出格式中断(json或xml),因此请使用提琴手/其他要求替代格式。
EBarr 2012年

2
@SteverB-不知道为什么有人拒绝了你。此答案在许多情况下都有效。
EBarr 2012年

1
我有同样的问题;我尝试了自定义的异常过滤器,全局配置等。它发生在所有事件之后的管道末端。只需一台服务器500就可以了。甚至将站点移至IIS 7.5并打开IIS跟踪-所做的只是确认500,没有别的,没有堆栈,没有什么让我知道失败的信息。在小解决方案中也100%复制。
Shawn Cicoria 2012年

1
@EBarr我对问题的描述很简短。如您所见,没有人要求添加更多详细信息。而且我仍然无法获得使用上述方法由服务器返回的服务器错误500的详细信息。
2012年



3

在我看来,一个看似简单的路由弱点导致了此问题:我的Api Controller中还有另一个具有相同签名(不是名称)的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 }
        );
    }
}

这似乎很疯狂,我想我应该把它拿出来。我不确定我是否会找到这个。这必须是有很多的是传递一个JSON对象等方法,任何人真正的疼痛
尼尔·P

假设这可能是一个功能而不是错误……它也使我们发疯了:-) ...或将在WebApi3中修复。
GGleGrand17年

2

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


2

此方案是由于以下原因引起的

  1. 发生此问题是由于Web.config格式错误。(多个configSections)

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

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

并且也不要忘记添加

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

到Web.config


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;
}

1

我遇到了同样的问题,但是它的出处略有不同:我CORS错误地设置了策略,这给了我500 Internal server error,但是由于CORS无法正常工作,Access-Control-Allow-Origin因此没有在响应中显示标头,并且浏览器无法读取实际响应

我使用ChromeDevTools选项解决了该问题,该选项Copy as cURL使我可以查看响应并了解错误的来源


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.