0

Web アプリケーションで Microsoft ASP.NET Web API 2.2 を使用しています。

コントローラーは次のようになります。

public class EventsController: ApiController
{
  [HttpGet]
  [Route("GetAllActivities")]
  public IEnumerable<IActivity> GetEvents()
  {
    /* stuff */
  }
}

問題 の説明 RouteAttribute クラスをプロジェクトに含めようとしていますが、そうするのが難しいことがわかりました。時々、それを取得したと思いますが、bin ディレクトリを削除して再度ビルドしようとすると、そこにはなく、Route という単語が赤く表示されます。もう 1 つの症状は、GlobalConfiguration.Configure と HttpConfiguration.MapHttpAttributeRoutes が失われることです。また、bin ディレクトリを消去してゼロからビルドすることの違いも理解できません。属性ベースのルーティングが WebAPI 2.2 の一部ではなく、アドオンであることを理解するのはさらに困難です。うまくいけば、一部のパッケージは必須であり、一部のパッケージはこれを機能させることが許可されていません。本当?

これは、特別な順序ではなく、私たちが試したことです。

  • インストール パッケージの AttributeRouting
  • インストール パッケージ AttributeRouting.WebApi
  • インストール パッケージ Microsoft.AspNet.WebApi.WebHost
  • 更新パッケージ - Microsoft.AspNet.WebApi.WebHost を再インストールします
  • 更新パッケージ - 再インストール
  • アンインストール パッケージの AttributeRouting

私はこれらすべてを一度に機能させましたが、同僚はリポジトリからコードをチェックアウトするときに RouteAttribute クラスを見つけることができず、単一のファイルを無視することはありませんでした。次に、bin ディレクトリを削除してバージョンを再構築したところ、RouteAttribute クラスが見つからないという状態に戻りました。

更新によって同じバージョンの Visual Studio を使用できるようにしましたが、問題は残っています。

MVC にもルート属性があり、それらが webapi ルート属性と同じではないことを認識しています。また、webapi ルート属性が Web ホスト型と自己ホスト型に分割されていることも認識しています。IIS でこれをホストしているため、参照リストに Ssytem.Web.Http.WebHost への参照を追加しようとしています。

残念ながら、彼らはすべてのアプリケーションで同じクラス名を維持するという決定を下しました。それらが異なっていれば、誤解は生じません。

csproj ファイルからの、プロジェクト内の参照のリストを次に示します。

<Reference Include="AttributeRouting, Version=3.5.6.0, Culture=neutral, PublicKeyToken=c10f85d521a011a9, processorArchitecture=MSIL">
    <HintPath>..\..\packages\AttributeRouting.Core.3.5.6\lib\net40\AttributeRouting.dll</HintPath>
    <Private>True</Private>
</Reference>
<Reference Include="AttributeRouting.Web, Version=3.5.6.0, Culture=neutral, PublicKeyToken=c10f85d521a011a9, processorArchitecture=MSIL">
    <HintPath>..\..\packages\AttributeRouting.Core.Web.3.5.6\lib\net40\AttributeRouting.Web.dll</HintPath>
    <Private>True</Private>
</Reference>
<Reference Include="AttributeRouting.Web.Http, Version=3.5.6.0, Culture=neutral, PublicKeyToken=c10f85d521a011a9, processorArchitecture=MSIL">
    <HintPath>..\..\packages\AttributeRouting.Core.Http.3.5.6\lib\net40\AttributeRouting.Web.Http.dll</HintPath>
    <Private>True</Private>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
    <HintPath>..\..\packages\Newtonsoft.Json.6.0.4\lib\net45\Newtonsoft.Json.dll</HintPath>
    <Private>True</Private>
</Reference>
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
    <HintPath>..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll</HintPath>
    <Private>True</Private>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Web.DynamicData" />
<Reference Include="System.Web.Entity" />
<Reference Include="System.Web.ApplicationServices" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Core" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
    <HintPath>..\..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll</HintPath>
    <Private>True</Private>
</Reference>
<Reference Include="System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
    <HintPath>..\..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll</HintPath>
    <Private>True</Private>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Drawing" />
<Reference Include="System.Web" />
<Reference Include="System.Xml" />
<Reference Include="System.Configuration" />
<Reference Include="System.Web.Services" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="WebActivator, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
    <HintPath>..\..\packages\WebActivator.1.0.0.0\lib\WebActivator.dll</HintPath>
    <Private>True</Private>
</Reference>
4

1 に答える 1

3

あなたは複数の質問を持っています。私はそれらすべてに答えようとします。

属性ルーティング

属性ルーティングは、WebAPI 2.2 の標準機能です。RouteAttribute既に行ったように、メソッドを an で装飾することで使用できます。この属性はパッケージに付属していますMicrosoft.AspNet.WebApi.WebHost

NuGet パッケージAttributeRoutingは、既定では WebAPI プロジェクトに含まれていない別のサード パーティ パッケージです。それをプロジェクトに追加したい場合は、次のようにインストールできます。

Install-Package AttributeRouting

私の推測では、おそらくこのパッケージは必要ないでしょう。

次に、パッケージ

NuGet パッケージは、ソリューションに追加できるサードパーティ モジュールです。追加されたパッケージは、packages という名前のソリューション フォルダーに格納されます (そのため、プロジェクトファイルHintPathに...\..\packages\*packages.config

これで、同僚がソース管理システム (TFS など) からソリューションを取得してソリューションをビルドすると、パッケージが (NuGet から) 自動的に取得され、ソリューションが機能するはずです。これは、Visual Studio の既定の動作です。ただし、ここで説明されているように、自動取得をオプトアウトすることは可能です。あなたまたはあなたの同僚がオプトアウトした場合、パッケージは取得されず、参照がないためソリューションはビルドされません。

次に、bin フォルダー

bin フォルダーは、Visual Studio がコンパイル済みのソリューションを配置するフォルダーです。つまり、ソリューションをビルドするたびに、VS はそのフォルダーを消去し、ソースをアセンブリにコンパイルして、コンパイルされたアセンブリと参照アセンブリを bin フォルダーに配置します。

たとえば、新しい同僚がソース管理からソリューションを取得する場合、彼には bin フォルダーがありません。彼がソリューションをビルドするとすぐに、ビルド アセンブリで満たされた bin フォルダーが作成されます。

最後に、ソリューションを修正します

元の問題 (認識されない) を修正するには、 RouteNuGet パッケージが自動的に取得されるかどうかを確認します。オプション

  • NuGet が不足しているパッケージをダウンロードできるようにする
  • Visual Studio でのビルド中に不足しているパッケージを自動的に確認する

両方をチェックする必要があります。どちらのオプションも、Visual Studio オプションのパッケージ マネージャーの [全般] 設定で使用できます。

その後、WebAPI パッケージをソリューションに追加する必要があります。

Install-Package Microsoft.AspNet.WebApi

Routeこれにより、いくつかの依存関係 (Microsoft.AspNet.WebApi.Client、Microsoft.AspNet.WebApi.Core、Microsoft.AspNet.WebApi.WebHost、およびNewtonsfot.Json) もインストールされ、その後GlobalConfiguration.ConfigureHttpConfiguration.MapHttpAttributeRoutes認識されます。

于 2016-03-10T18:17:06.880 に答える