9

我有带有 MVC 和 Razor 标记网站的 ASP.NET,我想在我的 Linux VPS 上运行它。

我有来自 Ubuntu 存储库的 mono 3.2.8 和 xsp4 3.0.0.0 版本(使用安装apt-get install mono-complete mono-xsp4

当我将网站上传到服务器并在网站文件夹中运行 xsp4 时,它会启动并打印出它正在侦听端口 8080。但是,当我使用 Web 浏览器导航到我的网站时,它会显示运行时错误,并且 xsp4 会将其输出到控制台

Missing method System.Web.HttpApplication::RegisterModule(Type) in assembly
/usr/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll, referenced 
in assembly /tmp/root-temp-aspnet-0/55726984/
assembly/shadow/df4b0596/52105b83_8d5b5e15_00000001/Microsoft.Owin.Host.SystemWeb.dll

Missing method RegisterAllAreas in assembly /tmp/root-temp-aspnet-
0/55726984/assembly/shadow/dc5a60b8/51013ead_8d5b5e15_00000001/<website_name>.dll, type
System.Web.Mvc.AreaRegistration

这是一个全新的 Ubuntu 14.04 安装。我正在使用 Visual Studio 2013 在 Windows 上开发我的网站。知道如何解决这些错误吗?

4

2 回答 2

4

有关此问题的上游错误报告位于此处

在修复错误并且实施的方法是使用Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule而不是HttpApplication.RegisterModule.

这里的问题描述了一种解决方法,即在OWINHttpApplication.RegisterModule中的 PreApplicationStart.cs 中更改为(以前的 master 已经有 NET 4.0 的相关 IFDEF,但由于某种原因它被还原)或包含他们指定的 DLL 或注册在 web.config 中手动模块。Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule

不需要对 OWIN 进行任何代码更改的替代方法是在 Mono 中实现缺少的方法并修复错误,然后将修复反向移植到您的 Mono 版本。

于 2015-02-03T01:16:58.220 回答
3

这并不是一个完整的答案,但也许我所做的可能会帮助某人走得更远。

在 Mono 的开发分支(当时是 v3.99)上填充了一些不相关的空白后,比如 AppendTrailingBackslash()、GetBufferlessInputStream() 和其他一些函数,我能够启动一个 MVC5 应用程序并运行正常在使用 XSP4 的 Ubuntu 上。

然后我尝试使用 OWIN 和 SignalR 的单构建版本。

我做了上面 Appleman1234 建议的事情,在 HttpApplication.cs 中实现 RegisterModule() 来做 Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule() 所做的事情。这似乎确实有效,并将模块字符串注入 system.web/httpModules 部分而没有错误。

这与在我的 system.web 中手动指定 OwinHttpHandler 相结合:

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <customErrors mode="Off" />

    <httpHandlers>
      <add verb="*" path="*" type="Microsoft.Owin.Host.SystemWeb.OwinHttpHandler, Microsoft.Owin.Host.SystemWeb" />
    </httpHandlers>

</system.web>

并在我的启动配置()中调用默认的 MapSignalR():

var appBuilder = app.MapSignalR();

并且在破解了一些 SignalR 代码之后(我在 NameValueCollection 上得到了一些 ReadOnlyException,因为它试图从请求标头中删除 Accept-Encoding ......我想我稍后会得到它),我想我明白了一直初始化到我至少可以浏览到 /signalr 并返回一些有意义的错误(缺少 connectionId、未知协议等)。我没有实际测试 SignalR 功能,但我将通过使用单独的客户端程序来测试。

我使用 xsp4/mono 4.5 托管它。

但是,这样做我认为我破坏了其余的处理程序/管道,因为我无法真正浏览到网站中的任何其他内容(样式表、脚本等),因为我得到了 404

另请注意:

(1)HttpRuntime.UsingIntegratedPipeline在 XSP4 的上下文中返回 false。

(2) 我不得不注释掉HttpApplication.cs/AsyncInvoker::Invoke()最初抛出这个异常的异常:

throw new Exception("This is just a dummy");

鉴于此,Mono 中是否还没有足够的异步和其他支持来让 OWIN/SignalR 工作?我在想,既然UsingIntegratedPipeline返回 false,那么 XSP4 就不行了吗?

于 2015-04-30T16:39:25.237 回答