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
- Install-Package AttributeRouting.WebApi
- Пакет установки Microsoft.AspNet.WebApi.WebHost
- Пакет обновлений - переустановите Microsoft.AspNet.WebApi.WebHost
- Update-Package -reinstall
- Uninstall-Package AttributeRouting
У меня все это работало один раз, тогда коллега не смог найти класс RouteAttribute при проверке кода из нашего репозитория, не игнорируя ни одного файла. Затем я удалил каталог bin и перестроил свою версию, и я не смог найти класс RouteAttribute.
Мы убедились, что у нас была та же версия Visual Studio, обновляя, но проблемы остаются.
Мне известно, что MVC также имеет атрибуты маршрута и что они не совпадают с атрибутами маршрута 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>
1 ответ
У вас есть несколько вопросов, и я постараюсь ответить на них все.
Маршрутизация атрибутов
Маршрутизация атрибутов - это стандартная функциональность WebAPI 2.2. Вы можете использовать его, украсив свой метод RouteAttribute
как вы уже сделали. Этот атрибут поставляется с пакетом Microsoft.AspNet.WebApi.WebHost
,
Пакет NuGet AttributeRouting
это еще один сторонний пакет, который по умолчанию не включен в проект WebAPI. Если вы хотите добавить это в свой проект, вы можете установить его так:
Install-Package AttributeRouting
Я думаю, вам, вероятно, не понадобится этот пакет.
Далее пакеты
Пакеты NuGet - это сторонние модули, которые вы можете добавить в свое решение. Добавленные пакеты хранятся в папке решений, называемой пакетами (поэтому файл вашего проекта содержит HintPath
в ..\..\packages\*
, Все пакеты, используемые любым проектом в вашем решении, хранятся там. Пакеты, используемые одним проектом, упоминаются в файле уровня проекта. packages.config
,
Теперь, когда сотрудник извлекает ваше решение из системы контроля версий (например, TFS) и создает ваше решение, пакеты должны автоматически извлекаться (из NuGet), и решение должно работать. Это поведение по умолчанию для Visual Studio. Однако можно автоматически отказаться от получения, как описано здесь. Если вы или ваш коллега отказались, пакеты не будут получены, и решение не будет создано из-за отсутствующих ссылок.
Затем папка
Папка bin - это папка, в которую Visual Studio поместит ваше скомпилированное решение. Это означает, что каждый раз, когда вы создаете свое решение, VS будет очищать эту папку, компилировать исходники в сборки и помещать скомпилированные сборки, а также ссылки на сборки в папку bin.
Например, когда новый сотрудник извлекает ваше решение из системы контроля версий, у него не будет папки bin. Как только он соберет решение, будет создана папка bin, заполненная сборочными сборками.
Наконец, исправление вашего решения
Чтобы исправить вашу первоначальную проблему (Route
не распознается) проверьте, автоматически ли извлекаются пакеты NuGet. Варианты
- Разрешить NuGet загружать недостающие пакеты
- Автоматически проверять отсутствующие пакеты во время сборки в Visual Studio
оба должны быть проверены. Оба параметра доступны в общих настройках диспетчера пакетов в параметрах Visual Studios.
После этого вам нужно добавить пакет 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
будет признан.