3

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();
        }

    }
}
4

1 に答える 1

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>

型名だけでなく、完全な名前空間が必要であることに注意してください。それが正しく機能する場合は、他に間違っているものが見つからないため、さらに多くのコードが必要だと思います。

于 2013-02-20T00:31:07.563 に答える