Asp.net web api 尝试将F#控制器与Web API结合使用
我在引用f#web Api库的c#mvc项目中遇到“无法从程序集MyApp.Api加载类型MyApp.Api.App”运行时错误。c#project MyApp.Web有一个对F#project MyApp.Api的项目引用,并且没有编译错误。可能是什么问题 MyApp.Api项目中的App.fsAsp.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
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路由映射到MVCRouteTable
。我真的很惊讶你没有得到编译错误
因此,上述情况似乎并非如此。我以前在没有拉入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。然而,你是对的;该模板似乎工作正常。