RouteAttribute缺失

时间:2016-03-10 16:10:34

标签: asp.net-web-api attributerouting routeattribute

我在Web应用程序中使用Microsoft ASP.NET Web API。

控制器如下所示:

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
  • Update-Package -reinstall Microsoft.AspNet.WebApi.WebHost
  • Update-Package -reinstall
  • 卸载程序包AttributeRouting

我完成了所有这一切工作,然后一个同事在检查我们的存储库中的代码时找不到RouteAttribute类,而不是忽略单个文件。然后我删除了bin目录并重建了我的版本,我倒退到无法找到RouteAttribute类。

我们通过更新确保我们拥有相同版本的visual studio,但问题仍然存在。

我知道MVC也有路由属性,并且它们与webapi路由属性不同。我也知道webapi路由属性在Web托管和自托管类型中分开。我试图在我的参考列表中引用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 个答案:

答案 0 :(得分:3)

你有多个问题,我会尝试全部回答。

属性路由

属性路由是WebAPI 2.2的标准功能。您可以使用RouteAttribute装饰方法来使用它,就像您已经完成的那样。此属性附带包Microsoft.AspNet.WebApi.WebHost

NuGet包AttributeRouting是默认情况下未包含在WebAPI项目中的另一个第三方包。如果要将其添加到项目中,可以像下面这样安装:

Install-Package AttributeRouting

我的猜测是,你可能不需要这个包。

接下来,套餐

NuGet包是您可以添加到解决方案中的第三方模块。添加的软件包存储在名为packages的解决方案文件夹中(这就是您的项目文件包含HintPath..\..\packages\*的原因。解决方案中任何项目使用的所有软件包都存储在那里。单个项目使用的软件包是在项目级别文件packages.config中引用。

现在,当同事从源控制系统(例如TFS)检索您的解决方案并构建您的解决方案时,应自动检索包(来自NuGet)并且解决方案应该有效。这是Visual Studio的默认行为。但是,可以选择退出自动检索described here。如果您或您的同事选择退出,将无法检索到包,并且由于缺少引用而无法构建解决方案。

然后, bin文件夹

bin文件夹是Visual Studio将编译解决方案的文件夹。这意味着,每次构建解决方案时,VS都会清理该文件夹,将源代码编译为程序集,并将已编译的程序集以及引用的程序集放在bin文件夹中。

E.g。当新的同事从源代码控制中检索您的解决方案时,他将没有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和{{1} }和GlobalConfiguration.Configure将被识别。