首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RouteAttribute不见了

RouteAttribute不见了
EN

Stack Overflow用户
提问于 2016-03-10 16:10:33
回答 1查看 3.7K关注 0票数 0

我正在一个Web应用程序中使用MicrosoftWebAPI2.2。

控制器如下所示:

代码语言:javascript
复制
public class EventsController: ApiController
{
  [HttpGet]
  [Route("GetAllActivities")]
  public IEnumerable<IActivity> GetEvents()
  {
    /* stuff */
  }
}

问题描述我们正在尝试将RouteAttribute类包含在我们的项目中,我们发现很难做到这一点。有时,我们认为我们得到了它,但是当我们删除bin目录并尝试重新构建时,它就不在那里了,这个单词的红色。另一个症状是GlobalConfiguration.Configure和HttpConfiguration.MapHttpAttributeRoutes将丢失。我们也无法理解它对清除bin目录并从头开始构建产生的影响。甚至很难理解基于属性的路由不是WebAPI 2.2的一部分,而是一个附加的部分。如果我们做得对,有些包是强制性的,而有些包不允许这样做。这是真的吗?

这是我们尝试过的,没有特别的顺序:

  • 安装包AttributeRouting
  • 安装包AttributeRouting.WebApi
  • 安装包Microsoft.AspNet.WebApi.WebHost
  • 更新包-reinstall Microsoft.AspNet.WebApi.WebHost
  • 更新包-reinstall
  • 卸载包AttributeRouting

我曾经做过所有这些工作,然后一个同事在从我们的存储库签出代码时找不到RouteAttribute类,而不是忽略一个文件。然后,我删除了bin目录并重新构建了我的版本,回到了无法找到RouteAttribute类的地步。

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

我知道MVC也有路由属性,它们与webapi路由属性不一样。我也知道webapi路由属性被划分为网络托管和自托管类型。我试图在我的参考列表中有一个对Ssytem.Web.Http.WebHost的引用,因为我们把它托管在一个IIS上。

不幸的是,他们决定对所有这些应用程序保持类名不变。如果它们不同,就不会产生误解。

以下是来自csproj文件的项目中引用的列表。

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-10 18:17:06

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

属性路由

属性路由是WebAPI 2.2的一个标准功能。您可以使用RouteAttribute来装饰您的方法,就像您已经做的那样。此属性与包Microsoft.AspNet.WebApi.WebHost一起提供。

NuGet包AttributeRouting是另一个默认不包含在WebAPI项目中的第三方包。如果要将其添加到项目中,可以按以下方式安装:

代码语言:javascript
复制
Install-Package AttributeRouting

我猜你可能不需要这个包了。

接下来,

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

现在,当同事从源代码管理系统(例如TFS)检索您的解决方案并构建解决方案时,包应该自动被检索(从NuGet),并且解决方案应该能工作。这是Visual的默认行为。然而,选择退出自动检索作为在此描述是可能的.如果您,或您的同事选择退出,包将不会被检索,解决方案不会因为缺少引用而构建。

然后, bin文件夹

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

例如,当新的同事从源代码管理中检索您的解决方案时,他将没有bin文件夹。一旦他构建了解决方案,bin文件夹将被创建一个充满生成程序集的文件夹。

最后,修复您的解决方案

若要修复原始问题(Route未识别),请检查是否自动检索NuGet包。备选方案

  • 允许NuGet下载丢失的包
  • 在Visual构建过程中自动检查缺少的包

都应该检查一下。这两个选项都可以在Visual Studio选项中的Package常规设置中使用。

之后,您必须将WebAPI包添加到解决方案中:

代码语言:javascript
复制
Install-Package Microsoft.AspNet.WebApi

这还将安装一些依赖项(Microsoft.AspNet.WebApi.Client、Microsoft.AspNet.WebApi.Core、Microsoft.AspNet.WebApi.WebHost和Newtonsfot.Json),然后将识别RouteGlobalConfiguration.ConfigureHttpConfiguration.MapHttpAttributeRoutes

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35921642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档