Asp.net web api 尝试将F#控制器与Web API结合使用

Asp.net web api 尝试将F#控制器与Web API结合使用,asp.net-web-api,f#,Asp.net Web Api,F#,我在引用f#web Api库的c#mvc项目中遇到“无法从程序集MyApp.Api加载类型MyApp.Api.App”运行时错误。c#project MyApp.Web有一个对F#project MyApp.Api的项目引用,并且没有编译错误。可能是什么问题 MyApp.Api项目中的App.fs namespace MyApp.Api open System open System.Web open System.Web.Mvc open System.Web.Routing open Sy

我在引用f#web Api库的c#mvc项目中遇到“无法从程序集MyApp.Api加载类型MyApp.Api.App”运行时错误。c#project MyApp.Web有一个对F#project 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中的my global.asax.cs

使用System.Web.Mvc;
使用System.Web.Optimization;
使用System.Web.Routing;
使用MyApp.Api;
名称空间MyApp.Web
{
公共类WebAPI应用程序:MyApp.Api.App//System.Web.HttpApplication
{
受保护的无效应用程序\u Start()
{
base.Start();
}
}
}

您注册的api路由不正确。虽然这些API看起来很相似,但事实并非如此。您需要使用
HttpConfiguration
实例注册Web API路由:

GlobalConfiguration.Configuration.Routes.MapHttpRoute("", "", ...)
您正在尝试将Web API路由映射到MVC
RouteTable
。我真的很惊讶你没有得到编译错误


因此,上述情况似乎并非如此。我以前在没有拉入Dan Mohl的项目模板的情况下尝试时,一定没有包含适当的名称空间

您已经将您的
MyApp.Api.App
子类化为
Global.asax.cs
。丹的模板不包括这个。相反,他的模板修改了
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>

受保护的无效应用程序\u启动(对象发送方,事件参数e){
base.Start();
}
这似乎很管用。我还做了以下工作:

<%@ 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>

受保护的无效应用程序\u启动(对象发送方,事件参数e){
base.Start();
}

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

您是否“清理”了解决方案?您甚至可以尝试关闭VS,删除每个项目文件夹中的“bin”和“obj”文件夹,然后重新启动VS并重建解决方案。可能是C#项目构建正常,因为它能够解析对
MyApp.Api.App
的引用,但当C#网站运行时,它使用的是一个旧(缓存)版本的F#DLL,其中
MyApp.Api.App
不存在(或具有不同的名称/命名空间)。尝试清理,关闭VS并删除所有bin文件,但仍然有相同的错误…嗯。。。我看不出这一计划失败的直接原因。你能把这个项目上传到什么地方吗?本周我会尝试上传一些东西。嗯,我刚刚创建了一个新的mvc web项目,并添加了对同一个f#项目的引用,看起来效果不错。原始的旧mvc web项目中一定有什么东西导致了问题,但没有编译时错误。这是我从默认的f#web api模板复制的代码。。这似乎在模板中起作用..啊,我假设你没有使用模板,因为你有一个Global.asax.cs。然而,你是对的;该模板似乎工作正常。