【问题标题】:ASP .Net WebAPI does not work with Owin when hosted using XSP/Mono使用 XSP/Mono 托管时,ASP .Net WebAPI 不适用于 Owin
【发布时间】:2016-05-11 10:55:52
【问题描述】:

我正在尝试使用具有 ASP .net Web APIOwin 组件的单声道运行一个项目 (refer solution here)。项目构建成功。但是,当我到达端点http://127.0.0.1:6666/customers 时,我得到以下错误。

System.Web.HttpException  
The resource cannot be found.

Description: HTTP 404.The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is  temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.

Details: Requested URL: /customers

Exception stack trace:
at System.Web.StaticFileHandler.ProcessRequest (System.Web.HttpContext context) [0x000a1] in /builddir/build/BUILD/mono-4.4.0/mcs/class/System.Web/System.Web/StaticFileHandler.cs:77 
at System.Web.DefaultHttpHandler.BeginProcessRequest  (System.Web.HttpContext context, System.AsyncCallback callback, System.Object state) [0x00098] in /builddir/build/BUILD/mono-4.4.0/mcs/class/System.Web/System.Web/DefaultHttpHandler.cs:101 
at System.Web.HttpApplication+<Pipeline>c__Iterator1.MoveNext () [0x00d9c] in /builddir/build/BUILD/mono-4.4.0/mcs/class/System.Web/System.Web/HttpApplication.cs:1335 
at System.Web.HttpApplication.Tick () [0x00000] in /builddir/build/BUILD/mono-4.4.0/mcs/class/System.Web/System.Web/HttpApplication.cs:927 

但是,CustomersController.Get() 端点被正确调用,这意味着框架能够转到正确的控制器。但是在终点之后发生了一些不好的事情。

注意: 值得一提的是,普通的 ASP .Net Web API 项目(没有 OWin)可以正常工作。 OWin 集成时出现问题。

我正在使用:

Mono JIT 编译器版本 4.4.0
Monodevelop 5.10
有关 Nuget 包的版本,请参阅 packages.config
这是WebApiConfig.cs
这是CustomerController.cs
这是Web.config

如果您想尝试一下,请refer/pull the code 并将其导入monodevelop。

我尝试在 Windows 中运行此解决方案,它在那里运行良好。
我无法弄清楚这种行为的原因。如果有人可以为我提供一些解决此问题的建议,那将非常有帮助。

【问题讨论】:

  • 显示 API 的路由配置并显示有问题的控制器。必须下载一个 zip 文件来尝试重现您的问题,并带有恶意软件的味道。 (恕我直言)
  • @Nkosi:将源代码托管在 github 上,方便查看。此外,使用指向您要求的文件的指针更新了问题。
  • 查看了代码,乍一看,一切看起来都按照应有的方式进行了配置。它在 Windows 上按预期工作的事实可能意味着该问题特定于单声道。我会留意类似的问题。
  • 运行时你在哪里托管 api。
  • 看起来不像我的问题。就像我说的,我能够成功地点击 action 方法,但是从 action 方法返回后发生了一些事情并给了我 404 错误。此外,只有在集成 OWIN 时才会出现此问题。没有 OWIN,WebAPI 也能正常工作。

标签: asp.net asp.net-web-api mono owin monodevelop


【解决方案1】:

如果您绝对需要在 XSP 上运行您的应用程序,那么我没有适合您的解决方案,抱歉。我开始阅读 Mono 的 source code of System.Web.HttpApplication,试图理解为什么请求会被静态文件处理程序处理,但如果不使用调试器,这是一项不可能完成的任务。

但如果您只需要在 Mono 上运行 Web API 应用程序,那么有一个非常简单的解决方案。由于您已将应用程序转换为 OWIN,因此您可以使用 OwinHost.exe(来自 OwinHost NuGet 包)而不是 xsp4.exe 来托管您的应用程序。在 OS X 10.11.6 上使用 Mono 5.4.1.7 / OwinHost 3.1.0 / Microsoft.AspNet.WebApi 5.2.3 对我来说效果很好。

摘自OwinHost documentation

启动 OwinHost:
使用 OwinHost 自托管 OWIN 应用程序就像从 Web 应用程序的项目目录中运行 OwinHost.exe 一样简单。项目目录在这里定义为 ./bin 的父目录,其中包含应用程序的程序集以及选定的服务器程序集。默认情况下,在没有附加参数的情况下运行 OwinHost.exe 时,主机将尝试定位并加载应用程序的启动类和 OWIN HttpListener 服务器。在启动类的帮助下构建 OWIN 管道后,它将开始侦听端口 5000。所有这些默认行为都可以使用 OwinHost.exe 的参数轻松更改,如下所述。

OwinHost 参数:
有多种方法可以自定义 OwinHost 的默认行为。例如,要选择与 OWIN 兼容的备用服务器,请运行以下命令:

OwinHost.exe -s

可以通过运行查看完整的选项列表:

OwinHost.exe /?

【讨论】:

  • 这个答案解决了一个令人头疼的问题,非常感谢。我试图将默认的 Web Api 2 转换为 Mono 上的 OWIN 应用程序,以便它与我想使用的包兼容。第二次我使用 OWIN 库从global.asax 更改为startup.cs,我会得到 OP 错误的排列。我在 OSX High Sierra 上的完整启动命令最终是 mono packages/OwinHost.4.0.0/tools/OwinHost.exe -d MyProjectName
猜你喜欢
  • 2018-04-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 2013-12-14
相关资源
最近更新 更多