WebApi的{“消息”:“发生错误”}在IIS7上,而不是在IIS Express中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebApi的{“消息”:“发生错误”}在IIS7上,而不是在IIS Express中相关的知识,希望对你有一定的参考价值。
我正在使用ASP.NET MVC 4 WebApi,并且在IIS Express上的本地计算机上运行它有很多乐趣。我已经将IIS Express配置为也为远程计算机提供服务,因此我公司的其他人正在使用我的计算机作为我们的网络服务器。
在确定这是一个不太理想的解决方案之后,我们决定在安装.NET 4.5之后将WebApi放在远程服务器上。当我使用fiddler并将POST发送到本地计算机上的控制器时,它会返回正确的响应,但是当我将域更改为运行IIS7的Web服务器时,同样的POST会返回一个神秘的
{“message”:“发生了错误”}
信息。任何人都知道会发生什么事吗?
问题是缺少依赖,不在服务器上,而是在我的本地计算机上。在我们的例子中,它是一个Devart.Data.Linq dll。
为了得到答案,我打开了IIS跟踪500个错误。这提供了一些信息,但真正有用的是在web.config中设置<system.web><customErrors mode="Off"/></system.web>
这指向缺少动态加载的依赖项。添加此依赖项并告知它在本地复制后,服务器开始工作。
Basically:
如果IncludeErrorDetailPolicy
没有为您解决问题,请使用CustomErrors
(例如,如果您的ASP.NET堆栈是> 2012):
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy
= IncludeErrorDetailPolicy.Always;
注意:小心返回详细的错误信息可以向“黑客”泄露敏感信息。请参阅下面的Simon对此答案的评论。
TL;DR version
对我来说,CustomErrors
并没有真正帮助。它已经设置为Off
,但我仍然只有一个可怜的an error has occurred
消息。我想接受的答案是从3年前开始的,现在网络词汇已经很久了。我正在使用Web API 2和ASP.NET 5(MVC 5),而Microsoft已经摆脱了仅限IIS的策略,而CustomErrors
则是旧的skool IIS;)。
无论如何,我在生产上遇到了一个我没有在本地的问题。然后发现我无法在我的开发机器上看到Chrome网络选项卡中的错误。最后,我设法通过在我的生产服务器上安装Chrome,然后在服务器本身上浏览应用程序(例如在'localhost'上)来解决它。然后堆栈跟踪和所有错误出现更详细的错误。
之后才发现this article from Jimmy Bogard(注:吉米是mr. AutoMapper!)。有趣的是,他的文章也是从2012年开始,但在其中他已经解释了CustomErrors
对此不再有帮助,但你可以通过在全局WebApi配置中设置不同的IncludeErrorDetailPolicy
来改变'错误细节'(例如, WebApiConfig.cs
):
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy
= IncludeErrorDetailPolicy.Always;
幸运的是,他还解释了如何设置webapi(2)听听你的CustomErrors
设置。这是一个非常明智的方法,这可以让你回到2012年:P。
注意:默认值为'LocalOnly',这解释了为什么我能够在找到此帖之前按照我描述的方式解决问题。但我明白并不是每个人都可以远程生产并启动浏览器(我知道在我决定成为自由职业者和DevOps之前我几乎不能)。
没有其他答案对我有用。
这样做:(在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 API端点时遇到了类似的问题。通过转动CustomErrors = Off,我能够看到实际的错误,其中一个dll丢失了。
如果这有助于任何人:
我有类似的问题,并按照Nates的说明添加:
<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文件移动到另一个位置并且忘记更改配置中的连接字符串节点(connectionsstrings节点使用“configSource”放置在单独的文件中,但这是另一个故事)。
当我在测试环境中遇到错误并且记得“我之前已经完成此操作时,我总是会遇到这个问题,但我可以直接在web.config中完成此操作,而无需修改代码并重新部署到测试环境,但这需要2次改变......又是什么呢?“
备查
<system.web>
<customErrors mode="Off"></customErrors>
</system.web>
和
<system.webServer>
<httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>
我的swagger XML文件未部署到 bin中:
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "SwaggerDemoApi");
c.IncludeXmlComments(string.Format(@"{0}inSwaggerDemoApi.XML",
System.AppDomain.CurrentDomain.BaseDirectory));
c.DescribeAllEnumsAsStrings();
})
http://wmpratt.com/swagger-and-asp-net-web-api-part-1/
必须在Release Configuration和Debug Configuration中进行设置。
以上是关于WebApi的{“消息”:“发生错误”}在IIS7上,而不是在IIS Express中的主要内容,如果未能解决你的问题,请参考以下文章
asp.net webapi bug : System.OperationCanceledException 异常处理
ASP.Net MVC 4 Web API 控制器不适用于 Unity.WebApi