Iis 7 WebApi';s{quot;message";:“发生错误”}在IIS7上,而不是在IIS Express中
我正在使用ASP.NET MVC 4 WebApi,并在IIS Express上的本地计算机上运行它,我感到非常有趣。我已经将IIS Express配置为也为远程计算机服务,所以我公司的其他人也将我的计算机用作我们的Web服务器 在确定这不是一个理想的解决方案后,我们决定在安装.NET4.5后将WebApi放在远程服务器上。当我使用fiddler并向本地机器上的控制器发送帖子时,它会返回正确的响应,但当我将域更改为运行IIS7的Web服务器时,同一帖子会返回一个神秘的响应 {“消息”:“发生错误”}Iis 7 WebApi';s{quot;message";:“发生错误”}在IIS7上,而不是在IIS Express中,iis-7,asp.net-mvc-4,asp.net-web-api,Iis 7,Asp.net Mvc 4,Asp.net Web Api,我正在使用ASP.NET MVC 4 WebApi,并在IIS Express上的本地计算机上运行它,我感到非常有趣。我已经将IIS Express配置为也为远程计算机服务,所以我公司的其他人也将我的计算机用作我们的Web服务器 在确定这不是一个理想的解决方案后,我们决定在安装.NET4.5后将WebApi放在远程服务器上。当我使用fiddler并向本地机器上的控制器发送帖子时,它会返回正确的响应,但当我将域更改为运行IIS7的Web服务器时,同一帖子会返回一个神秘的响应 {“消息”:“发生错误
信息。有人知道会发生什么吗?问题是缺少依赖项,该依赖项不在服务器上,但在我的本地计算机上。在我们的例子中,它是一个Devart.Data.Linq dll
为了得到这个答案,我打开了500个错误的IIS跟踪。这提供了一点信息,但真正有用的是web.config设置
,这表明缺少动态加载的依赖项。添加此依赖项并告诉它在本地复制后,服务器开始工作。我在发布到WebAPI端点时遇到了类似的问题。通过关闭CustomErrors=Off,我可以看到一个DLL丢失的实际错误。基本上:
如果CustomErrors
不能为您解决问题(例如,如果您是ASP.NET stack is>2012),请使用IncludeErrorDetailPolicy
:
注意:返回详细的错误信息可能会向“黑客”泄露敏感信息。见下面西蒙对这个答案的评论
TL;DR版本
对我来说,CustomErrors
没有真正的帮助。它已经被设置为关闭,但我仍然只收到一条轻微的错误信息。我猜人们接受的答案是3年前的,这在当今的网络世界里已经很久了。我使用的是Web API 2和ASP.NET 5(MVC 5),Microsoft已经不再使用仅限IIS的策略,而CustomErrors
是旧的skool IIS;)
不管怎么说,我在制作上遇到了一个本地没有的问题。然后发现我无法在Chrome的网络选项卡中看到错误,就像在我的开发机器上一样。最后,我设法解决了这个问题,在我的生产服务器上安装了Chrome,然后在服务器上浏览应用程序(例如“localhost”)。然后,堆栈跟踪和所有跟踪出现了更详细的错误
直到后来我才发现(注:吉米是)。有趣的是,他的文章也是从2012年开始的,但在文章中他已经解释了CustomErrors
不再有帮助,但是您可以通过在全局WebApi配置(例如WebApiConfig.cs
)中设置不同的includeerrordeailpolicy
)来更改“错误详细信息”:
幸运的是,他还解释了如何设置webapi(2)来监听您的CustomErrors
设置。这是一个非常明智的方法,这让你可以回到2012年:P
注意:默认值是'LocalOnly',这解释了为什么我在找到这篇文章之前能够以我描述的方式解决这个问题。但我明白,并不是每个人都可以远程生产并启动浏览器(我知道,在我决定成为自由职业者和DevOps之前,我基本上不能这样做)。当我在测试环境中遇到错误时,我总是会问这个问题,并记住,“我以前做过,但我可以直接在web.config中完成,而无需修改代码并重新部署到测试环境,但需要做2个更改。。。又是什么?” 供日后参考
<system.web>
<customErrors mode="Off"></customErrors>
</system.web>
及
如果这对任何人都有帮助: 我有一个类似的问题,并按照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文件移动到了另一个位置,忘记了更改配置中的ConnectionString节点(ConnectionString节点使用“configSource”放在一个单独的文件中,但这是另一个故事)。其他答案对我都不起作用 这是:(在Startup.cs中) (也可以将其放在WebApiConfig.cs中):
我的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();
})
它必须在发布配置和调试配置中进行设置。如果.NET Framework的machine.config中有
,则不会看到详细的错误消息。请确保设置为false或不存在。因此我尝试了所有建议的解决方案,但均无效。
我所做的只是设置从服务器运行应用程序,它会完整显示错误,当我将customErrors模式设置为false时,这应该可以工作,但它没有。当我从服务器浏览API时,我就能够看到问题。错误响应上的HTTP状态码是什么?如果是500,则很可能是网站/应用程序错误fig对于使用IIS 7的远程计算机无效。请在远程计算机上创建一个简单的HTML文件,如果可能,在远程计算机上浏览以确保可以查看该文件,然后尝试从您的计算机上点击该文件以查看是否成功。这是一个500错误。感谢您的建议,但是WebApi提供的默认index.HTML页面ides可以工作。还应该补充一点,一些API Web服务可以工作,而其他的不能工作,而它们都在我的本地机器上工作。当你看到500错误时,你需要启用以获得更多细节。500错误通常发生在Web API路由启动之前,但我猜它是正确的
<system.webServer>
<httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>
<system.web>
<customErrors mode="Off"/>
</system.web>
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
// Here:
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
}
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;
}
}
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "SwaggerDemoApi");
c.IncludeXmlComments(string.Format(@"{0}\bin\SwaggerDemoApi.XML",
System.AppDomain.CurrentDomain.BaseDirectory));
c.DescribeAllEnumsAsStrings();
})