我使用的是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的一部分,而是一个附加组件的。如果我们做对了,有些包是强制性的,有些包不允许这样做。这是真的吗?
这是我们尝试过的,没有特殊的顺序:
- 安装包属性路由
- 安装包AttributeRouting。WebApi
- 安装软件包Microsoft。AspNet。WebApi。WebHost
- 更新包-重新安装Microsoft。AspNet。WebApi。WebHost
- 更新包-重新安装
- 卸载包AttributeRouting
我曾经处理过所有这些,然后一位同事在从我们的存储库中签出代码时找不到RouteAttribute类,没有忽略一个文件。然后我删除了bin目录并重新构建了我的版本,我倒退到找不到RouteAttribute类。
我们通过更新确保了我们拥有相同版本的visual studio,但问题仍然存在。
我知道MVC也有路由属性,它们与webapi路由属性不是一回事。我还知道webapi路由属性分为网络托管和自托管两种。我正试着参考Ssytm。网状物Http。WebHost在我的参考列表中,因为我们在IIS上托管它。
不幸的是,他们决定对所有这些应用程序保持类的名称不变。如果它们不同,就不会发生误解。
以下是csproj文件中项目中的引用列表。
<Reference Include="AttributeRouting, Version=3.5.6.0, Culture=neutral, PublicKeyToken=c10f85d521a011a9, processorArchitecture=MSIL">
<HintPath>....packagesAttributeRouting.Core.3.5.6libnet40AttributeRouting.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="AttributeRouting.Web, Version=3.5.6.0, Culture=neutral, PublicKeyToken=c10f85d521a011a9, processorArchitecture=MSIL">
<HintPath>....packagesAttributeRouting.Core.Web.3.5.6libnet40AttributeRouting.Web.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="AttributeRouting.Web.Http, Version=3.5.6.0, Culture=neutral, PublicKeyToken=c10f85d521a011a9, processorArchitecture=MSIL">
<HintPath>....packagesAttributeRouting.Core.Http.3.5.6libnet40AttributeRouting.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>....packagesNewtonsoft.Json.6.0.4libnet45Newtonsoft.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>....packagesMicrosoft.AspNet.WebApi.Client.5.2.3libnet45System.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>....packagesMicrosoft.AspNet.WebApi.Core.5.2.3libnet45System.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>....packagesMicrosoft.AspNet.WebApi.WebHost.5.2.3libnet45System.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>....packagesWebActivator.1.0.0.0libWebActivator.dll</HintPath>
<Private>True</Private>
</Reference>
您有多个问题,我会尽力全部回答。
属性路由
属性路由是WebAPI 2.2的标准功能。您可以通过用RouteAttribute
装饰您的方法来使用它,就像您已经做过的那样。此属性随程序包Microsoft.AspNet.WebApi.WebHost
一起提供。
NuGet包AttributeRouting
是另一个默认情况下不包含在WebAPI项目中的第三方包。如果你想把它添加到你的项目中,你可以这样安装:
Install-Package AttributeRouting
我的猜测是,你可能不需要这个包裹。
接下来,包裹
NuGet包是第三方模块,您可以将其添加到解决方案中。添加的包存储在一个名为包的解决方案文件夹中(这就是为什么您的项目文件包含HintPath
到....packages*
。解决方案中任何项目使用的所有包都存储在那里。单个项目使用的包在项目级文件packages.config
中引用。
现在,当同事从源代码管理系统(例如TFS(检索您的解决方案并构建您的解决程序时,应该自动检索包(从NuGet(,并且解决方案应该可以工作。这是Visual Studio的默认行为。但是,可以选择不自动检索,如本文所述。如果您或您的同事选择退出,则由于缺少引用,将无法检索包,也无法构建解决方案。
然后,bin文件夹
bin文件夹是VisualStudio将编译后的解决方案放在其中的文件夹。这意味着,每次构建解决方案时,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
。