正如标题所说,我从GET请求到IQueryable操作有500个内部服务器错误。错误的主体是空的。我的操作返回结果后发生错误。
我使用ASP.NET Web API RC。
如何获得该错误的堆栈跟踪?
答案 0 :(得分:56)
您可以尝试添加:
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy =
IncludeErrorDetailPolicy.Always;
到Global.asax中的Application_Start()
。此解决方案适用于许多常见错误。
但是,如果您没有获得满意的信息,则应考虑编写l 例外过滤器并在全球范围内注册。
This article应该让你入门。你需要的核心是写作&注册如下:
public class NotImplExceptionFilter : ExceptionFilterAttribute {
public override void OnException(HttpActionExecutedContext context) {
if (context.Exception is NotImplementedException) {
context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
}
}
}
答案 1 :(得分:8)
发布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();
答案 2 :(得分:4)
我遇到了同样的问题。我发现Kiran Challa's response有助于在实际操作之外抛出实际异常。
为解决我的问题,setting the ProxyCreationEnabled property of my context to false让我更进了一步。
在我的场景中,我的下一个例外是由于模型中的循环引用。清理完之后,幻影500的响应消失了。祝你好运,如果你还没有解决这个问题!
答案 3 :(得分:3)
这可能与循环参考有关。
尝试将以下代码添加到Global.asax文件中的Application_Start方法:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
答案 4 :(得分:3)
在我的案例中,一个欺骗性的简单路由弱点导致了这个问题:在我的Api控制器中有另一个具有相同签名(不是名称)的HttpPost。默认路由不解析名称差异,ServiceError 500是在达到任一Api函数之前给出的响应。解决方案:更改默认路由或签名,然后重试。
这是我的RouteConfig.cs,它非常适用于标准的WebApi2用法:
ObservableCollection<string>
答案 5 :(得分:2)
当我没有按正确的顺序指定查询参数时,我在RC中遇到了问题。例如,如果您指定$skip=0
,它将获得500,但如果您指定$orderby=xxx&skip=0
则没有错误。
答案 6 :(得分:2)
此场景是由于以下原因造成的
由于Web.config格式错误而导致出现问题。 (多个configSections)
我没有在 bin 文件夹中创建 roslyn 文件夹,而是在根目录创建了它。 (部署地点。)
诊断这个问题的最佳方法是,在应用程序位置放置一个简单的HTML页面并尝试浏览它。 500错误描述将显示在此html页面上。
也不要忘记添加
<customErrors mode="Off"></customErrors>
到Web.config
答案 7 :(得分: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;
}
答案 8 :(得分:1)
我遇到了同样的问题,但它的来源略有不同:
我错误地设置了Source.tick(...).map(loadFromMongo)
政策,这给了我CORS
,但由于500 Internal server error
无效,CORS
标题未作为回复显示,浏览器无法读取实际回应
我使用ChromeDevTools选项Access-Control-Allow-Origin
解决了这个问题,它允许我查看响应并了解错误来源
答案 9 :(得分:0)
ApiController
操作方法的异常过滤器属性。