我在我的引用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();
}
}
}
答案 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>
请注意,您需要完整的命名空间,而不仅仅是类型名称。如果这是正常的,那么我认为更多的代码是必要的,因为我找不到任何其他错误。