尝试将F#控制器与Web API一起使用

时间:2013-02-19 14:57:50

标签: asp.net-web-api f#

我在我的引用f#web api库的c#mvc项目中遇到“无法从程序集MyApp.Api加载MyApp.Api.App”类型的运行时错误。 c#项目MyApp.Web有一个对F#项目MyApp.Api的项目引用,没有编译错误。可能是什么问题?

项目MyApp.Api中的App.fs

namespace MyApp.Api

open System
open System.Web
open System.Web.Mvc
open System.Web.Routing
open System.Web.Http
open System.Data.Entity
open System.Net.Http.Headers

open System.Net.Http.Headers

type Route = { controller : string; action : string; id : UrlParameter }
type ApiRoute = { id : RouteParameter }

type App() =
    inherit System.Web.HttpApplication() 

    static member RegisterGlobalFilters (filters:GlobalFilterCollection) =
        filters.Add(new HandleErrorAttribute())

    static member RegisterRoutes(routes:RouteCollection) =
        routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" )
        routes.MapHttpRoute( "DefaultApi", "api/{controller}/{id}", 
            { id = RouteParameter.Optional } ) |> ignore
        routes.MapRoute("Default", "{controller}/{action}/{id}", 
            { controller = "Home"; action = "Index"; id = UrlParameter.Optional } ) |> ignore

    member this.Start() =
        AreaRegistration.RegisterAllAreas()
        App.RegisterRoutes RouteTable.Routes
        App.RegisterGlobalFilters GlobalFilters.Filters

我的MyApp.Web中的global.asax.cs

using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using MyApp.Api;

namespace MyApp.Web
{
    public class WebApiApplication :  MyApp.Api.App// System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            base.Start();
        }

    }
}

1 个答案:

答案 0 :(得分:2)

您正在错误地注册api路由。虽然API看起来很相似,但它们并非如此。您需要使用HttpConfiguration实例注册Web API路由:

GlobalConfiguration.Configuration.Routes.MapHttpRoute("", "", ...)

您正在尝试将Web API路由映射到MVC RouteTable。我真的很惊讶你没有得到编译错误。


所以上面似乎并非如此。我没有在没有拉入Dan Mohl的项目模板的情况下尝试过,我必须包含一个合适的命名空间。

您已将MyApp.Api.App类型细分为Global.asax.cs。 Dan的模板不包括此内容。相反,他的模板会修改Global.asax中的标记,如下所示:

<%@ Application Inherits="MyApp.Api.App" Language="C#" %>
<script Language="C#" RunAt="server">

  protected void Application_Start(Object sender, EventArgs e) {
      base.Start();
  }

</script>

这似乎工作得很好。我还有以下工作:

<%@ Application Inherits="MyApp.Web.WebApiApplication" Language="C#" %>
<!-- The following seems to be optional; just an extra, duplicate event handler.
     I was able to run the app with this script and without. -->
<script Language="C#" RunAt="server">

  protected void Application_Start(Object sender, EventArgs e) {
      base.Start();
  }

</script>

请注意,您需要完整的命名空间,而不仅仅是类型名称。如果这是正常的,那么我认为更多的代码是必要的,因为我找不到任何其他错误。