別のプロジェクトのMVCソリューションのWeb API


88

私は新しいMVC4プロジェクトを作成しています。研究の結果、JavaScriptからサーバー側への通信は、コントローラーアクションではなくWeb APIフレームワークを介して実現する方がよいと信じるようになりました。私の理解はこれで正しいですか?

私はすべての属性などをWeb APIとMVCコントローラー間で共有できると思います。そのため、一見すると、私にとって大きな変更ではないようです。

アプリケーションをセットアップするとき、コンポーネントをプロジェクトに分割したいです。私の計画は、MVCプロジェクトとWeb APIプロジェクトを用意することでした。しかし、私は問題に出くわしました。例えば、私は2つのアプリなどで終わりました、別々のルーティング設定など

だから私の質問は、MVCアプリケーションでは、Web APIフレームワークが同じプロジェクト内にあるのか、それともWeb APIを独自のプロジェクトに分離して問題を回避すべきなのか?

回答:


110

残念ながらあなたはそれについて間違っています- 私はすべての属性などをweb apiとmvcコントローラーの間で共有できると思いますので、一見すると、それは私にとって大きな変更ではないようです。

Web APIとMVCで使用されている概念の多くは、一見似ていても実際には互換性がありません。たとえば、Web API属性System.Web.Http.Filters.FilterとMVC属性はSystem.Web.Mvc.Filter-であり、それらは交換可能ではありません。

同じことが他の多くの概念にも当てはまります-モデルバインディング(完全に異なるメカニズム)、ルート(Web APIはルートではなくHTTPRoutesを使用しますが、両方とも同じ基になるRouteTableで動作します)、依存関係リゾルバー(互換性なし)など-表面は、実際には非常に異なります。さらに、Web APIにはエリアの概念がありません。

最終的に、JSONコンテンツを提供するための「新しい、トレンディな」方法を実現することだけが目的の場合は、その道を進む前によく考えてください。本当にHTTPを取り入れてRESTfulな方法でアプリを構築することを検討しているのでない限り、既存のコードをリファクタリングすることはお勧めしません。

それはすべて、実際に何を構築しているかに依存します。新しいプロジェクトを開始していて、必要なのは、JSONを提供してWebアプリを円滑にすることだけです-潜在的に重複する可能性のあるコード(上記のようなもの)を使用する場合は、Web APIを簡単にホストできますASP.NET MVCと同じプロジェクト。

オンラインサービス用の適切なAPIを構築する場合(おそらく外部の顧客やモバイルアプリに燃料を供給するなどのさまざまなデバイスによって消費される場合)は、Web APIを別のプロジェクトに分割するだけです。


2
+1すばらしい答え。特にフィルター、モデルバインディングなどの場合、MVCとWebAPIの両方が一部のコードを共有する可能性があると最初は思っていましたが、それらはまったく異なります。
VJAI 2012年

5
そうしたシナリオでは、Visual Studioで新しいMVC4プロジェクトを開始するだけで、プロジェクトテンプレート(2番目の画面)を求められたら、Web APIを選択するだけです。これにより、NugetからWeb APIがインストールされ、説明したケースでは完全に問題ありません。得られるのは、Global.asaxにプラグインされた個別のWeb API構成ファイルです。さらに、APIコントローラーを別のフォルダーに分離することもできます(デフォルトでは、MVCコントローラーと一緒になっています)。最後に、デフォルトルートは明らかに個別に構成され、互いに干渉しません
Filip W

9
彼が私たちの現在のプロジェクトを設計する前に、私のリーダーがこの投稿を読んでくれれば幸いです。
Billdr 2013年

2
@FilipW良い説明をありがとう。また、MVCアプリケーションがあり、Androidアプリケーションのサービスを使用するためにWebAPI2を使用します。一方、David Pedenが以下に述べるように、WebAPIの新しい個別のプロジェクトを作成することを決定する場合、セキュリティ、メンテナンス、およびデプロイメントも非常に重要です。その場合、それらを念頭に置いて、何を提案しますか?WebAPIの新しい個別のプロジェクトを作成するか、現在のMVCプロジェクトを使用するには 前もって感謝します。
ジャック

1
非常に良い「オンラインサービスに適切なAPIを構築する場合にのみ、Web APIを別のプロジェクトに分離します-おそらく、外部の顧客によって、またはモバイルアプリに燃料を供給するなどのさまざまなデバイスによって消費されます。」頭に釘を打つと、それを行う方法を簡単に決定できます。
ozzy432836 2017年

27

IMO、セキュリティ、および展開が決定を推進するはずです。たとえば、MVCアプリでフォーム認証を使用していて、APIに基本認証(SSLを使用)を使用したい場合は、個別のプロジェクトを使用すると作業が楽になります。Youtサイト​​をwww.example.comでホストし、APIをapi.example.com(vs.www.example.com/api)としてホストする場合は、個別のプロジェクトを使用すると作業が簡単になります。プロジェクトを分離し、それに応じてサブドメインを作成し、独自のAPIをMVCアプリから利用する場合は、APIへのクライアント側呼び出しの同一生成元ポリシーの問題に対処する方法を理解する必要があります。これに対する一般的な解決策は、jsonpまたはCORSを活用することです(可能であれば)。

更新(2013年3月26日):公式CORSサポートが提供されています:http ://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API


私はWeb APIをMVCアプリケーションと統合するか、それを個別のプロジェクトとして持つかという決定にまつわる問題を回避しようとしています。WebホストのサブドメインにWeb API HelloWorldアプリを正常にデプロイできました。この別のプロジェクトでは、おそらくMVC Webアプリケーションのモデルを使用し、その別のプロジェクトでコードを呼び出します。別のプロジェクトのこのルートをたどる方が簡単なようですが、このアプローチでどのような問題が発生すると思いますか?
Ciaran Gallagher

2
個人的には、APIのDTOとしてビューモデルを使用しません。ビューモデルとAPIシグネチャが分かれるので、その決定があなたに将来深刻な苦痛を引き起こすことを私は期待します。SoC(en.wikipedia.org/wiki/Separation_of_concerns)は非常に重要です。
David Peden 2013

@DavidPeden WebAPIの新しい個別のプロジェクトを作成することをお勧めします。本当?一方、WebAPIの新しい個別のプロジェクトを作成します(現在、アプリケーションにUIレイヤー(MVC)とデータレイヤー(クラスライブラリ)があるため、DIも使用しますが、使用できるかどうか疑問に思っています新しく作成されたWebAPIプロジェクトのデータレイヤーにある同じエンティティ、リポジトリ、インターフェイス、抽象クラスで、WebAPIコントローラを作成するだけでよいですか?または、それらすべて(エンティティ、リポジトリ、インターフェイス、抽象)も作成しますクラス)再びWebAPIのために?助けてください?
Jack

1
@ H.Johnson意味のある一般的なアドバイスを提供することは困難ですが、エンティティとリポジトリをカプセル化するアプリケーションサービスレイヤーを使用して、両方のUI(MVCとAPI)で活用できると便利だと思われます。
デビッドPeden

9

ある程度の経験の後(アプリとmvcのAPIの作成)。私はほとんど両方を行います。

他のクライアントまたは他のデバイス(Android / IOSアプリ)からのA​​PI呼び出し用に別のプロジェクトを作成します。その理由の1つは、認証が異なるため、(ステートレスを維持するために)トークンベースであるためです。これをMVCアプリケーション内で混在させたくありません。

私のmvcアプリケーションへのjavascript / jquery api呼び出しでは、物事をシンプルに保つために、MVCアプリケーション内にWeb APIを含めます。私はjavascript api呼び出しでトークンベースの認証を行うつもりはありません。なぜなら、それは同じアプリケーションにあるからです。[authorize]APIエンドポイントで属性を使用できますが、ユーザーがログインしていないと、データを取得できません。

さらに、ショッピングカートを処理していて、ユーザーのショッピングカートをセッションに(ログインしていない状態で)保存したい場合、JavaScriptコードを使用して商品を追加/削除する場合は、これもAPIに含める必要があります。これにより、APIは確実にステートフルになりますが、MVC-APIの複雑さも軽減されます。


4
まあ@Dimi、それはいくつかの票を得るために役に立たない編集です...どうすればこれらを拒否できますか?
CularBytes 2016年

やりたいことをしてください。私は投票で編集するのではなく、見栄えをよくするために私はそれを想定しています。どうぞ。
開発者

3
@CularBytes編集を拒否することはできませんが、再度編集して変更をロールバックすることはできます。これには2,000担当者未満のピアレビュープロセスが必要ですが、すぐにそれを行うのに十分な担当者がいます。編集により付加価値がなく、ロールバックされたことに同意します。
Dan Bechard 2017年


5

最近、ほぼ同じことを行いました。VS2012でWeb APIテンプレートを選択する新しいMVC 4 Webアプリケーションプロジェクトから始めました。

これにより、MVCと同じアプリケーションでホストされるWeb APIが作成されます。

ApiControllersを別のクラスライブラリプロジェクトに移動したいと思いました。これはかなり簡単でしたが、解決策は少し隠されていました。

MVC 4プロジェクトのAssemblyInfo.csに、同様のコード行を追加します

[assembly: PreApplicationStartMethod(typeof(LibraryRegistrator), "Register")]

ここでクラスLibraryRegistratorが必要になります(名前は自由に付けてください)。

public class LibraryRegistrator
    {
        public static void Register()
        {
            BuildManager.AddReferencedAssembly(Assembly.LoadFrom(HostingEnvironment.MapPath("~/bin/yourown.dll")));
        }
    }

MVC 4プロジェクトでは、Apiライブラリへの参照も追加します。

これで、Apiコントローラーを独自のクラスライブラリ(yourown.dll)に追加できます。


2

プロジェクトが2つの「フロントエンド」を保証するほど複雑である場合でも、最後の手段として、webapiを個別のプロジェクトに分割することだけを検討します。導入の問題が発生し、初心者がソリューションの構造を理解するのが難しくなります。ルーティングの問題は言うまでもありません。

system.web名前空間を1つの「プレゼンテーションレイヤー」に分離しておくことを目指します。webapiはプレゼンテーションではありませんが、それでもアプリケーションのインターフェースの一部です。コントローラではなくドメインにロジックを保持している限り、あまり多くの問題に遭遇しないでください。また、エリアを使用することを忘れないでください。


1
個別のプロジェクトを必要とする主な理由は、APIが実際にはフロントエンドではないということです。それは中間層です。
lordcheeto 2014

6
「初心者が理解するのは難しいだろう」というのは、どちらか一方のアプローチを選択する大きな理由にはなりません。可能な限りシンプルにしてください。ただし、複雑なニーズには複雑なソリューションが必要になることがよくあります。初心者向けのダムコードを書くのではなく、スマートコードを理解して書くように初心者をトレーニングする必要があります。
Dan Bechard 2017年

0

Web.Api用に個別のDLLをセットアップすることに加えて。

ただの提案:

  1. プロジェクトを作成する
  2. ナゲットWebActivatorEx
  3. app_start時に呼び出されるクラスメソッドを作成します。

    [アセンブリ:WebActivatorEx.PostApplicationStartMethod(typeof(API.AppWebActivator)、 "Start")]

    [アセンブリ:WebActivatorEx.ApplicationShutdownMethod(typeof(API.AppWebActivator)、 "Shutdown")]

  4. Startメソッド内にweb.apiルートを登録する

    public static void Start(){GlobalConfiguration.Configure(WebApiConfig.Register); }

  5. プロジェクトをWebプロジェクトに参照します。Startメソッドをアクティブにします。

お役に立てれば。


0

APIコントローラーを新しいプロジェクトに分割してみました。私がしたことは、新しいライブラリプロジェクトを作成し、APIという名前のフォルダー内にコントローラーを移動することだけです。次に、ライブラリプロジェクトの参照をMVCプロジェクトに追加しました。

webAPI構成はMVCプロジェクト自体に残されています。正常に動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.