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

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

我使用ASP.NET Web API RC。

我怎样才能得到这个错误的堆栈跟踪?

RC后,这个问题已经修复,除了500内部服务器错误之外,您还将获得错误的详细信息。 (但是,这个问题仅适用于Web主机scheme)。

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

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

您可以尝试添加:

 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

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

但是,如果您没有得到满意的信息,则应考虑编写一个“ 例外filter”并在全球范围内进行注册。

这篇文章应该让你开始。 你需要的核心是写和注册类似于:

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

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

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

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

这可能与循环引用有关。

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; 

在我的情况下,一个令人毛骨悚然的简单的路由弱点导致了这个问题:在我的Api控制器中有另一个具有相同签名(不是名称)的HttpPost。 缺省路由不能解决名称差异,ServiceError 500是在达到任何一个Api函数之前给出的响应。 解决scheme:更改默认路由或您的签名,然后重试。

这里是我的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 } ); } } 

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

我通常使用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; } 

FredrikNormén写了一篇很棒的博客文章,名为ASP.NET Web APIexception处理 。 他的解决scheme使用自定义的exception类和可应用于所有ApiController操作方法的exceptionfilter属性。

我有同样的问题,但它的来源略有不同:我错误地设置CORS策略,并给我500 Internal server error ,但由于CORS不起作用, Access-Control-Allow-Origin头没有响应和浏览器无法读取实际响应

我解决了ChromeDevTools选项Copy as cURL ,这让我看到了答案,并了解错误的来源

这种情况是由于以下原因造成的

  1. 由于Web.config格式不正确,问题发生了。 (多个configSections)

  2. 我不是在bin文件夹中创buildroslyn文件夹,而是在根目录下创build它。 (部署位置)

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

也不要忘记添加

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

到Web.config