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响应消失了。 祝你好运,如果你还没有解决这个问题!
这可能与循环引用有关。
尝试将以下代码添加到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
,这让我看到了答案,并了解错误的来源
这种情况是由于以下原因造成的
-
由于Web.config格式不正确,问题发生了。 (多个configSections)
-
我不是在bin文件夹中创buildroslyn文件夹,而是在根目录下创build它。 (部署位置)
最好的诊断方法是,在应用程序位置放置一个简单的HTML页面,并尝试浏览它。 500错误描述将显示在这个html页面上。
也不要忘记添加
<customErrors mode="Off"></customErrors>
到Web.config