我有使用MVC和Razor标记网站的ASP.NET,我想在我的Linux VPS上运行它。
我有单声道3.2.8和xsp4 3.0.0.0版本,都来自Ubuntu存储库(使用apt-get install mono-complete mono-xsp4
安装)
当我将我的网站上传到服务器并在网站的文件夹中运行xsp4时,它会启动并打印出它正在侦听端口8080.但是当我使用我的网络浏览器导航到我的网站时,它会显示运行时错误和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上开发我的网站。任何想法如何解决这些错误?
答案 0 :(得分:4)
有关此问题的上游错误报告位于here。
在修复错误并实施方法之前,建议的解决方法是使用Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule
而不是HttpApplication.RegisterModule
。
The issue here描述了一种解决方法,即在OWIN中将HttpApplication.RegisterModule
更改为PreApplicationStart.cs {{3}}(之前的主人已经拥有了.NET 4.0的相关IFDEF,但是它由于某种原因被还原)或包含他们指定的DLL或在web.config中手动注册模块。
不需要对OWIN进行任何代码更改的替代方法是在Mono中实现缺少的方法并修复错误,然后将修复程序向后移植到Mono版本。
答案 1 :(得分:3)
这不是一个完整的答案,但也许我所做的可能会帮助别人更进一步。
在Mono的dev分支(当时是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中是否还没有足够的Async和其他支持来使OWIN / SignalR工作?我在想,因为UsingIntegratedPipeline
返回false,这对XSP4来说是不行的?