在 IIS7上 WebApi 的{“ message”: “ an error has been”} ,而不是在 IISExpress 中

我正在使用 ASP.NET MVC 4 WebApi,在 IIS Express 的本地计算机上运行它非常有趣。我已经配置了 IISExpress 来服务于远程计算机,所以我公司的其他人正在使用我的计算机作为我们的网络服务器。

在确定这是一个不太理想的解决方案之后,我们决定在安装之后将 WebApi 放在一个远程服务器上。NET 4.5.当我使用 fiddler 并向本地机器上的控制器发送一个 POST 时,它返回正确的响应,但是当我将域更改为运行 IIS7的 webserver 时,同样的 POST 返回一个神秘的响应

{“ message”: “已发生错误”}

有人知道这是怎么回事吗?

117298 次浏览

问题是缺少一个不在服务器上但在我的本地计算机上的依赖项。对我们来说,是德瓦特。百科。Linq dll.

为了得到这个答案,我打开 IIS 跟踪查找500个错误。这提供了一些信息,但真正有用的是 web.config 设置的 <system.web><customErrors mode="Off"/></system.web>。这指出缺少动态加载的依赖项。在添加这个依赖项并告诉它在本地复制之后,服务器就开始工作了。

我在发送到 WebAPI 端点时遇到了类似的问题。通过关闭 CustomErrors= Off,我可以看到实际的错误,其中一个 dll 丢失了。

基本上:

如果 CustomErrors不能解决问题,使用 IncludeErrorDetailPolicy代替(例如,如果你的 ASP.NET 栈大于2012) :

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy
= IncludeErrorDetailPolicy.Always;

注意: 返回详细的错误信息时要小心,否则会泄露给“黑客”敏感信息。

DR 版本

对我来说,CustomErrors没什么帮助。它已经设置为 Off,但我仍然只得到一个微不足道的 an error has occurred消息。我想大家都接受的答案是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 之前我基本上不能)。

当我在测试环境中遇到错误时,我总是会想到这个问题,并且记住,“我以前做过这个,但是我可以直接在 web.config 中做,而不需要修改代码并重新部署到测试环境中,但是需要做2次修改... ... 再说一遍是什么来着?”

以备将来参考

<system.web>
<customErrors mode="Off"></customErrors>
</system.web>

还有

<system.webServer>
<httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>

以防这对任何人有帮助:

我也遇到过类似的问题,按照纳茨的指示,我补充道:

<system.web>
<customErrors mode="Off"/>
</system.web>

这向我展示了关于错误的更多信息:

“ ExceptionMessage”: “无法加载指定的元数据资源”, “ ExceptionType”: “ System. Data. Entity. Core. MetadataException”, “ StackTrace”: “ at 系统。数据。实体。核心。元数据。编辑。元数据。

这时我才想起来,我已经将 edmx 文件移动到了另一个位置,忘记了更改配置中的 Connectionstring 节点(Connectionsstring 节点使用“ configSource”放在一个单独的文件中,但那是另一回事)。

其他的答案对我都不管用。

这样做: (在 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;
}
}

我那夸张的 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/

enter image description here

它必须在发布配置和调试配置中设置。

如果你有 <deployment retail="true"/>在你的。NET Framework 的 machine.config,您不会看到详细的错误消息。确保设置为 false 或不存在。

所以我尝试了所有建议的解决方案,但都无济于事。 我所做的只是设置从服务器运行应用程序,它显示了全部错误,这应该工作时,我设置 customErrormode 为 false,但它没有。当我从服务器上浏览 API 的时候,我就看到了问题所在。