RouteAttribute отсутствует

Я использую Microsoft ASP.NET Web API 2.2 в веб-приложении.

Контроллер выглядит так:

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

Описание проблемы Мы пытаемся включить класс RouteAttribute в наш проект и обнаружили, что это сложно сделать. Иногда мы думаем, что получили его, но когда мы удаляем каталог bin и пытаемся выполнить сборку снова, его там нет, а слово Route окрашено в красный цвет. Еще одним симптомом является отсутствие GlobalConfiguration.Configure и HttpConfiguration.MapHttpAttributeRoutes. Мы также не понимаем, в чем разница между удалением каталога bin и сборкой с нуля. Трудно даже понять, почему маршрутизация на основе атрибутов уже не является частью WebAPI 2.2, а является надстройкой. Если мы все правильно поняли, некоторые пакеты являются обязательными, а некоторые пакеты не могут заставить это работать. Это правда?

Это то, что мы пробовали, в произвольном порядке:

  • Install-Package AttributeRouting
  • Пакет установки AttributeRouting.WebApi
  • Пакет установки Microsoft.AspNet.WebApi.WebHost
  • Update-Package - переустановить Microsoft.AspNet.WebApi.WebHost
  • Обновление-Пакет-переустановить
  • Uninstall-Package AttributeRouting

У меня все это работало один раз, потом коллега не смог найти класс RouteAttribute при проверке кода из нашего репозитория, не проигнорировав ни одного файла. Затем я удалил каталог bin и перестроил свою версию, и я вернулся к тому, что не смог найти класс RouteAttribute.

Мы добились того, что у нас была та же версия Visual Studio путем обновления, но проблемы остались.

Я знаю, что MVC также имеет атрибуты маршрута и что они не совпадают с атрибутами маршрута webapi. Я также знаю, что атрибуты маршрута webapi разделены на веб-хостинг и самостоятельный хостинг. Я пытаюсь добавить ссылку на Ssytem.Web.Http.WebHost в свой список ссылок, потому что мы размещаем это в IIS.

К сожалению, они приняли решение оставить имена классов одинаковыми для всех этих приложений. Если бы они были другими, недопонимания не было бы.

Вот список ссылок в проекте из файла 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>

person Anders Lindén    schedule 10.03.2016    source источник
comment
Вы используете NuGet?   -  person Nkosi    schedule 10.03.2016
comment
@Nkosi Он делает Install-package, а некоторые HintPath содержат packages, так что да, он использует NuGet.   -  person venerik    schedule 10.03.2016


Ответы (1)


У вас есть несколько вопросов, и я постараюсь ответить на них все.

Маршрутизация атрибутов

Маршрутизация атрибутов — это стандартная функциональность WebAPI 2.2. Вы можете использовать его, украсив свой метод RouteAttribute, как вы уже сделали. Этот атрибут поставляется с пакетом 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, заполненная сборками сборки.

Наконец, исправление вашего решения

Чтобы устранить исходную проблему (Route не распознается), проверьте, извлекаются ли пакеты NuGet автоматически. Варианты

  • Разрешить NuGet загружать отсутствующие пакеты
  • Автоматически проверять отсутствующие пакеты во время сборки в Visual Studio

оба должны быть проверены. Оба параметра доступны в общих настройках диспетчера пакетов в параметрах Visual Studio.

После этого вам нужно будет добавить пакет WebAPI в ваше решение:

Install-Package Microsoft.AspNet.WebApi

Это также установит некоторые зависимости (Microsoft.AspNet.WebApi.Client, Microsoft.AspNet.WebApi.Core, Microsoft.AspNet.WebApi.WebHost и Newtonsfot.Json), после чего будут распознаны Route, GlobalConfiguration.Configure и HttpConfiguration.MapHttpAttributeRoutes.

person venerik    schedule 10.03.2016