【问题标题】:RouteAttribute is missing缺少路由属性
【发布时间】:2016-06-25 14:26:22
【问题描述】:

我在 Web 应用程序中使用 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.WebApi
  • 安装包 Microsoft.AspNet.WebApi.WebHost
  • 更新包-重新安装 Microsoft.AspNet.WebApi.WebHost
  • 更新包-重新安装
  • 卸载包属性路由

我曾经让所有这些工作,然后一位同事在从我们的存储库中签出代码时找不到 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>

【问题讨论】:

  • 你在使用 NuGet 吗?
  • @Nkosi 他在做Install-package 和一些HintPaths 包含packages 所以,是的,他正在使用NuGet。

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


【解决方案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 的默认行为。但是,可以选择退出自动检索为described here。如果您或您的同事选择退出,则将不会检索包,并且由于缺少引用而无法构建解决方案。

然后,bin文件夹

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),然后是 RouteGlobalConfiguration.Configure 和 @987654333 @ 将被识别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多