4

Product.ApiWebAPI サイトに使用されるいくつかのコントローラーを含むプロジェクト (という名前) があります。コントローラは名前空間にありますProduct.Api.Controllers。このプロジェクトには、他にもいくつかのヘルパー機能があります。これはライブラリにコンパイルされます。

という名前の別の通常の ASP.NET MVC4 Web サイトもありますProduct.Web。これには、コントローラー (名前空間の下Product.Web.Controllers)、モデル、およびビュー (対応するフォルダー内) があります。またGlobal.asax.cs、ルーティング情報を持つ もあります。

サイトが IIS (.NET 4.5、IIS7、統合モードなど) で作成されている場合、Product.Apidll を bin フォルダーにコピーします。Product.Webがメインサイトです。

ここで、URL http://www.product.com/api/ {Controller}/{id} を WebAPI のものとhttp://www.product.com/ {Controller}/{Action}/{にマップする必要がありますid} を通常の MVC にマップします。

これは私のルートとして私が今持っているものです:

routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}", 
                defaults: new {id = RouteParameter.Optional}
            ).Constraints["Namespaces"] = new string[] { "Product.Api.Controllers" };

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ,
                namespaces: new[] { "Product.Web.Controllers" }
            );

残念ながら、API URL (この場合、例はhttp://www.product.com/api/Tables/でした) にアクセスすると (または ID を定義した場合でも)、HTTP 404 エラーが発生します。

http://www.product.com/Home/Indexは問題なく動作します。

奇妙なことに、ルーティング デバッガー ツールを試してみましたが、まだ問題がありました。実際、デバッガーの出力を見ることはできませんでした。http://www.product.com/Home/Indexhttp://www.product.com/はどちらもビューを表示しますが、すべての api/* はまだ 404 を示しています。デバッガーからの出力はまだ見ていません。

とにかく、望ましい効果を得る方法はありますか?

編集: global.asax.cs ファイルがProduct.Web名前空間にあることに気付きました。名前空間にあるように変更しましたが、Productまだうまくいきません。

4

2 に答える 2

4
routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}", 
                defaults: new {id = RouteParameter.Optional}
            ).Constraints["Namespaces"] = new string[] { "Product.Api.Controllers" };

これはMapHttpRouteでは機能しません。

他のビンからApiControllerルートを使用する場合は、制約を削除するだけで、ランタイムが自動的にApiControllerをビンから取得します。MapHttpRouteはMVCコントローラーに干渉せず、その逆も同様であるため、とにかく制約は必要ありません。

または、これを使用してHttpRoute名前空間を制限します

routes.DataTokens["Namespaces"] = new string[] {"MyNamespace"};

または、このソリューションを使用します(ただし、実際には、ビンの外にあるものを保持する場合にのみ必要です)。

于 2012-07-25T07:18:55.743 に答える
-1

MapHttpRoute Factory 呼び出しの前に、System.Web.Mvc.ControllerBuilder.Current.DefaultNamespaces.Add("Namespace.Full.Controllers"); を追加します。

于 2013-03-26T21:35:44.043 に答える