但后来我们认为这不是最佳解决方案,因此安装了.NET 4.5,并将WebApi放到远程服务器上。当我使用Fiddler发送POST请求到本地机器上的控制器时,它会返回正确的响应,但是当我将域更改为运行IIS7的Web服务器时,相同的POST请求会返回一个加密的
{"message":"an error has occurred"}
消息。有没有人知道出了什么问题?
但后来我们认为这不是最佳解决方案,因此安装了.NET 4.5,并将WebApi放到远程服务器上。当我使用Fiddler发送POST请求到本地机器上的控制器时,它会返回正确的响应,但是当我将域更改为运行IIS7的Web服务器时,相同的POST请求会返回一个加密的
{"message":"an error has occurred"}
消息。有没有人知道出了什么问题?
mode="RemoteOnly"
,如果在服务器上的Web浏览器上运行页面,则还可以查看错误,而不会影响站点的其他部分的安全性。 - Simon_Weaver如果CustomErrors
无法解决问题(例如,如果您的ASP.NET堆栈是>2012),请使用IncludeErrorDetailPolicy
:
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy
= IncludeErrorDetailPolicy.Always;
注意:返回详细的错误信息可能会向'黑客'泄露敏感信息,请参见下面这个答案中Simon的评论。
对我而言,CustomErrors
并没有真正帮助我。它已经被设置为Off
,但我仍然只收到了一个微不足道的发生了错误
消息。我猜验收答案是3年前的,而在当今网络世界里,这是很长的时间。我正在使用Web API 2和ASP.NET 5(MVC 5),而微软已经摆脱了仅适用于IIS的策略,而CustomErrors
是老派的IIS ;)。
无论如何,我遇到了一个本地没有的产品问题。然后发现我不能像在我的开发机器上那样在Chrome的网络选项卡中查看错误。最后,我通过在生产服务器上安装Chrome,然后在服务器本身上浏览应用程序(例如在“localhost”上)来解决了这个问题。然后更详细的错误信息出现了,并显示了堆栈跟踪等信息。
之后我才发现Jimmy Bogard的这篇文章(注:Jimmy是自动映射器先生!)。有趣的是,他的文章也是来自2012年,但在其中,他已经解释了CustomErrors
不再起作用,但您可以通过在全局WebApi配置中设置不同的IncludeErrorDetailPolicy
(例如:WebApiConfig.cs
)来更改“错误详细信息”:
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy
= IncludeErrorDetailPolicy.Always;
幸运的是,他还解释了如何设置Web API(2)以便听取您的CustomErrors
设置。这是一个相当合理的方法,这使您可以回到2012年:P。
注意:默认值为“LocalOnly”,这就解释了为什么在找到这篇文章之前我能够用我描述的方式解决问题。但我知道并非每个人都可以远程连接到生产环境并启动浏览器(直到我决定自由职业和DevOps)。
if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }
的快速hack来设置这样的选项。然后我可以在生产环境中测试它,如果我忘记禁用它,明天它将神奇地恢复到正常行为。 - Simon_Weaver其他答案对我都没有用。
这个有用:(在Startup.cs中)
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
// Here:
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
}
< p >(或者您可以将其放在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中进行更改而不必修改代码并重新部署到测试环境,但需要进行两次更改……又是什么来着?”时,我总是会回到这个问题。
供日后参考
<system.web>
<customErrors mode="Off"></customErrors>
</system.web>
与
<system.webServer>
<httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>
如果有人需要帮助,可能以下信息会对您有所帮助:
我曾经遇到相似的问题,在按照Nate的指示进行操作后,我加入了以下内容:
<system.web>
<customErrors mode="Off"/>
</system.web>
这给我展示了更多有关错误的信息:
"ExceptionMessage": "无法加载指定的元数据资源。", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": " at System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(...
这时我想起自己已经将edmx文件移动到另一个位置,但忘记修改配置文件中的connectionstrings节点(使用"configSource"将connectionsstrings节点放在单独的文件中,但那是另一个故事)。
当我向WebAPI端点发布内容时,遇到了类似的问题。将CustomErrors设置为Off后,我能够看到实际的错误信息,发现其中一个dll文件丢失。
我的Swagger 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/
必须在发布配置和调试配置中进行设置。
如果在你的 .NET Framework 的 machine.config 文件中有 <deployment retail="true"/>
,你将看不到详细的错误信息。请确保该设置为 false 或不存在。
所以我尝试了所有建议的解决方案,但都没有成功。 我所做的只是从服务器运行应用程序,并显示完整的错误信息,当我将customErrors模式设置为false时,这应该可以工作,但它没有。当我从服务器浏览API时,我能够看到问题。