在Linux上使用xsp运行ASP.NET应用程序时缺少方法错误

时间:2014-11-30 11:01:20

标签: asp.net linux mono xsp

我有使用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上开发我的网站。任何想法如何解决这些错误?

2 个答案:

答案 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来说是不行的?