我正在使用 ASP.NET MVC 4 WebApi,并且在我的本地计算机上的 IIS Express 上运行它很有趣。我也将 IIS Express 配置为为远程计算机提供服务,因此我公司中的其他人将我的计算机用作我们的网络服务器。
在确定这是一个不太理想的解决方案后,我们决定在安装 .NET 4.5 后将 WebApi 放在远程服务器上。当我使用提琴手并将 POST 发送到本地计算机上的控制器时,它返回正确的响应,但是当我将域更改为运行 IIS7 的网络服务器时,相同的 POST 返回一个神秘的
{“消息”:“发生错误”}
信息。有人知道会发生什么吗?
问题是缺少不在服务器上但在我的本地计算机上的依赖项。在我们的例子中,它是一个 Devart.Data.Linq dll。
为了得到这个答案,我打开了 IIS 跟踪 500 错误。这提供了一些信息,但真正有用的是在 web.config 中设置 <system.web><customErrors mode="Off"/></system.web>
这表明缺少动态加载的依赖项。添加此依赖项并告知将其复制到本地后,服务器开始工作。
基本上:
如果 CustomErrors
不能为您解决问题,请改用 IncludeErrorDetailPolicy
(例如,如果您的 ASP.NET 堆栈大于 2012):
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy
= IncludeErrorDetailPolicy.Always;
注意:小心返回详细的错误信息可能会向“黑客”泄露敏感信息。请参阅下面西蒙对此答案的评论。
TL;DR 版本
对我来说 CustomErrors
并没有真正帮助。它已经设置为 Off
,但我仍然只收到一条微不足道的 an error has occurred
消息。我想公认的答案是从 3 年前开始的,这在如今的网络词中已经很长时间了。我正在使用 Web API 2 和 ASP.NET 5 (MVC 5),微软已经放弃了仅 IIS 的策略,而 CustomErrors
是旧的 skool IIS ;)。
无论如何,我对本地没有的产品有疑问。然后发现我在 Chrome 的网络选项卡中看不到错误,就像在我的开发机器上一样。最后,我设法通过在我的生产服务器上安装 Chrome,然后在服务器本身上浏览到应用程序(例如在“本地主机”上)来解决它。然后更详细的错误出现在堆栈跟踪和所有内容中。
之后我才找到 this article from Jimmy Bogard(注意:Jimmy 是 mr. AutoMapper!)。有趣的是,他的文章也是 2012 年的,但在其中,他已经解释说 CustomErrors
不再对此有帮助,但您可以通过在全局 WebApi 配置(例如 WebApiConfig.cs
):
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy
= IncludeErrorDetailPolicy.Always;
幸运的是,他还解释了如何设置 Web API (2) 会监听您的 CustomErrors
设置。这是一个非常明智的方法,这可以让你回到 2012 年:P。
注意:默认值为'LocalOnly',这解释了为什么我能够在找到这篇文章之前按照我描述的方式解决问题。但我知道并不是每个人都可以远程生产和启动浏览器(我知道在我决定成为自由职业者和 DevOps 之前,我大多不能)。
if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }
这样的快速破解来设置这样的选项。然后我可以在生产中测试它,如果我忘记禁用它,明天它会神奇地恢复到正常行为。
其他答案都不适合我。
这样做了:(在 Startup.cs 中)
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
// Here:
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
}
(或者你可以把它放在 WebApiConfig.cs 中):
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Here:
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
}
当我在测试环境中遇到错误时,我总是会遇到这个问题并记住,“我以前做过,但是我可以直接在 web.config 中进行操作,而无需修改代码并重新部署到测试环境,但需要进行 2 次更改……又是什么?”
备查
<system.web>
<customErrors mode="Off"></customErrors>
</system.web>
和
<system.webServer>
<httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>
如果这对任何人都有帮助:
我有一个类似的问题,并按照我添加的 Nates 说明:
<system.web>
<customErrors mode="Off"/>
</system.web>
这向我展示了有关该错误的更多信息:
“ExceptionMessage”:“无法加载指定的元数据资源。”,“ExceptionType”:“System.Data.Entity.Core.MetadataException”,“StackTrace”:“在 System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource .LoadResources(...
这是当我记得我已将 edmx 文件移动到其他位置并且忘记更改配置中的连接字符串节点时(连接字符串节点使用“configSource”放置在单独的文件中,但这是另一回事)。
发布到 WebAPI 端点时,我遇到了类似的问题。通过打开 CustomErrors=Off,我能够看到缺少 dll 之一的实际错误。
我的招摇 XML 文件没有部署到 \bin:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "SwaggerDemoApi");
c.IncludeXmlComments(string.Format(@"{0}\bin\SwaggerDemoApi.XML",
System.AppDomain.CurrentDomain.BaseDirectory));
c.DescribeAllEnumsAsStrings();
})
http://wmpratt.com/swagger-and-asp-net-web-api-part-1/
https://i.stack.imgur.com/l7IXy.png
它必须在发布配置和调试配置中进行设置。
如果您的 .NET Framework 的 machine.config 中有 <deployment retail="true"/>
,您将不会看到详细的错误消息。确保该设置为假或不存在。
所以我尝试了所有建议的解决方案都无济于事。我所做的只是设置从服务器运行应用程序并完整显示错误,当我将 customErrors 模式设置为 false 时这应该可以工作,但它没有。当我浏览服务器的 API 表单时,我就发现了问题。
mode="RemoteOnly"
,如果您在服务器上的网络浏览器上运行该页面,如果该站点的其余部分可从外部访问,您也会看到错误而不会影响安全性