如标题所示,从GET请求到IQueryable操作,我收到了500个内部服务器错误。错误的主体为空。该错误在我的操作返回结果后发生。
我使用ASP.NET Web API RC。
如何获得该错误的堆栈跟踪信息?
如标题所示,从GET请求到IQueryable操作,我收到了500个内部服务器错误。错误的主体为空。该错误在我的操作返回结果后发生。
我使用ASP.NET Web API RC。
如何获得该错误的堆栈跟踪信息?
Answers:
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();
您可以尝试添加:
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);
}
}
}
.ToList()
来检查查询,3)禁用或调试任何消息处理程序的第二部分(该ContinueWith()
部分),或3)输出格式中断(json或xml),因此请使用提琴手/其他要求替代格式。
我遇到了同样的问题。我发现Kiran Challa的回应有助于将实际异常抛出我的动作之外。
为了解决我的问题,将上下文的ProxyCreationEnabled属性设置为false可以使我更进一步。
在我的场景中,下一个例外是由于模型中存在循环引用。清理完之后,幻影500响应消失了。如果您还没有解决这个问题,请祝您好运!
这可能与循环参考有关。
尝试将以下代码添加到Global.asax文件中的Application_Start方法中:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
在我看来,一个看似简单的路由弱点导致了此问题:我的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 }
);
}
}
FredrikNormén撰写了一篇很棒的博客文章,名为ASP.NET Web API异常处理。他的解决方案使用自定义异常类和可应用于所有ApiController
操作方法的异常过滤器属性。