正如标题所说,我从 GET 请求到 IQueryable 操作有 500 内部服务器错误。错误正文为空。该错误发生在我的操作返回结果之后。
我使用 ASP.NET Web API RC。
如何获得该错误的堆栈跟踪?
正如标题所说,我从 GET 请求到 IQueryable 操作有 500 内部服务器错误。错误正文为空。该错误发生在我的操作返回结果之后。
我使用 ASP.NET Web API RC。
如何获得该错误的堆栈跟踪?
您可以尝试添加:
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);
}
}
}
发布 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();
我遇到了同样的问题。我发现Kiran Challa 的回应有助于让实际异常被抛出我的行动之外。
为了解决我的问题,将上下文的 ProxyCreationEnabled 属性设置为 false让我更进一步。
在我的场景中,我的下一个例外是由于我的模型中的循环引用。清理完之后,幻象 500 响应消失了。如果你还没有解决这个问题,祝你好运!
在我的案例中,一个看似简单的路由弱点导致了这个问题:在我的 Api 控制器中有另一个具有相同签名(不是名称)的 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 }
);
}
}
这可能与循环引用有关。
尝试将以下代码添加到 Global.asax 文件中的 Application_Start 方法:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
当我没有以正确的顺序指定查询参数时,我在 RC 中遇到了问题。例如,如果您指定$skip=0
,它将得到 500,但如果您指定$orderby=xxx&skip=0
没有错误。
这个场景是由于以下原因引起的
该问题是由于 Web.config 格式错误而发生的。(多个配置部分)
我没有在bin文件夹中创建 roslyn文件夹,而是在根目录下创建了它。(部署位置。)
诊断此问题的最佳方法是在应用程序位置放置一个简单的 HTML 页面并尝试浏览它。500 错误描述将显示在此 html 页面上。
并且不要忘记添加
<customErrors mode="Off"></customErrors>
到 Web.config
我通常使用 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;
}
我有同样的问题,但它的来源略有不同:我设置的CORS
策略不正确,这给了我500 Internal server error
,但由于CORS
不起作用,Access-Control-Allow-Origin
标题没有在响应中显示,浏览器无法读取实际响应
我使用 ChromeDevTools 选项解决了这个问题,Copy as cURL
这让我可以看到响应并了解错误来源
Fredrik Normén 就该主题写了一篇很棒的博客文章,名为ASP.NET Web API 异常处理。他的解决方案使用自定义异常类和可应用于所有ApiController
操作方法的异常过滤器属性。