【问题标题】:MVC 4 Hosted on external hosting provider get Http error 500 - Internal Server Error托管在外部托管服务提供商上的 MVC 4 获取 Http 错误 500 - 内部服务器错误
【发布时间】:2017-02-04 17:58:09
【问题描述】:

如果我在本地 IIS 中访问我的 MVC 网站,没有错误,但如果我将 MVC 网站托管给外部托管服务提供商,我得到了

错误 500 - 内部服务器错误

图片如下:

注意:我的 MVC 应用程序正在使用虚拟路径提供程序,并允许 MEF 在运行时使用插件 dll,我的主站点运行正常。所有页面都可以访问,但是插件的页面不能访问。为什么会这样?


-------- 更新--------

我追踪了错误,我发现了这个:

合成产生了单个合成错误。根本原因是 下面提供。查看 CompositionException.Errors 属性 更详细的信息。

1) 指定的参数超出了有效值的范围。范围 名称:网站

导致:尝试创建实例时发生异常 'EAAccountingControllers.EAAccountingController' 类型。

导致:无法激活部件 'EAAccountingControllers.EAAccountingController'。元素: EAccountingControllers.EAAccountingController --> EAccountingControllers.EAAccountingController --> AssemblyCatalog (Assembly="EAAccounting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

导致:无法导出 'EAAccountingControllers.EAAccountingController (ContractName="EAAccounting")' 来自部分 'EAAccountingControllers.EAAccountingController'。元素: EAccountingControllers.EAAccountingController (ContractName="EAAccounting") --> EAccountingControllers.EAAccountingController --> AssemblyCatalog (Assembly="EAAccounting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")

这是我的MEF问题,插件莫名其妙地产生了这个错误,我想知道发生了什么?

【问题讨论】:

  • 查看事件日志。此外,您可能想在此处发布图片之前隐藏一些细节......!
  • IIS 也会记录一些日志。在极少数情况下,这些日志会提供确切的错误。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 hosting


【解决方案1】:

问题可能来自MefContrib.Web.Mvc库,似乎是由某些方法调用触发的。以下是 Fordio 对“Why are my controllers being instantiated when they're not being called?”的一些解释:

工厂覆盖GetControllerType,我假设尝试解决 存在于默认位置以外的程序集中的控制器 应用程序或其参考。实施 GetControllerType 首先调用 base.GetControllerType 看是否 Defaultcontroller 可以解决。

如果不能 - 不存在的 url 就是这种情况 - 它会询问 实现 IController 的所有导出的 MEF。这会返回一个 IEnumerable> 每个类都有一项 在 bin/ 文件夹中实现 IController(默认情况下)。

然后它在 IEnumerable 上运行 linq 查询,调用 GetType() 每个 Lazy 的 Value 属性。请求价值 a Lazy 强制创建实例。这就是为什么每个 bin/ 中的控制器正在为一个没有 存在。

正如它所说,与插件链接的每个控制器都可能映射到不存在的页面,请尝试检查引用插件的代码的每个部分,或删除控制器工厂声明代码上的 MefContrib 引用并使用 @987654327 @ 代替(确保在进行编辑之前有备份,以防您需要回滚错误的更改)。

此外,您可以按照该问题的 OP (https://stackoverflow.com/a/18188344/6378815) 的建议检查 Application_Start 上的 SetControllerFactory 方法,像这样注释掉方法用法:

// ControllerBuilder.Current.SetControllerFactory(new CompositionControllerFactory(new CompositionControllerActivator(dependencyResolver)));

AFAIK,MEFContrib 实现允许定位放置在/bin 目录之外的控制器,如果控制器工厂无法识别所需视图的给定路径,则会出现问题。如果这些解决方案仍然不起作用,请尝试检查外部主机上的 IIS 配置,确保已正确设置 MEF 实例。

其他参考资料:

MSDN Reference

How to integrate MEF with ASP.NET MVC 4 and ASP.NET Web API

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2020-09-07
    • 2013-08-10
    • 2014-01-10
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多