我正在一个Web应用程序中使用MicrosoftWebAPI2.2。
控制器如下所示:
public class EventsController: ApiController
{
[HttpGet]
[Route("GetAllActivities")]
public IEnumerable<IActivity> GetEvents()
{
/* stuff */
}
}问题描述我们正在尝试将RouteAttribute类包含在我们的项目中,我们发现很难做到这一点。有时,我们认为我们得到了它,但是当我们删除bin目录并尝试重新构建时,它就不在那里了,这个单词的红色。另一个症状是GlobalConfiguration.Configure和HttpConfiguration.MapHttpAttributeRoutes将丢失。我们也无法理解它对清除bin目录并从头开始构建产生的影响。甚至很难理解基于属性的路由不是WebAPI 2.2的一部分,而是一个附加的部分。如果我们做得对,有些包是强制性的,而有些包不允许这样做。这是真的吗?
这是我们尝试过的,没有特别的顺序:
我曾经做过所有这些工作,然后一个同事在从我们的存储库签出代码时找不到RouteAttribute类,而不是忽略一个文件。然后,我删除了bin目录并重新构建了我的版本,回到了无法找到RouteAttribute类的地步。
我们通过更新确保了visual的相同版本,但问题仍然存在。
我知道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>发布于 2016-03-10 18:17:06
你有多个问题,我试着全部回答。
属性路由
属性路由是WebAPI 2.2的一个标准功能。您可以使用RouteAttribute来装饰您的方法,就像您已经做的那样。此属性与包Microsoft.AspNet.WebApi.WebHost一起提供。
NuGet包AttributeRouting是另一个默认不包含在WebAPI项目中的第三方包。如果要将其添加到项目中,可以按以下方式安装:
Install-Package AttributeRouting我猜你可能不需要这个包了。
接下来,包
NuGet包是您可以添加到解决方案中的第三方模块。添加的包存储在一个名为packages的解决方案文件夹中(这就是为什么您的项目文件包含HintPath到..\..\packages\* )。解决方案中任何项目使用的所有包都存储在解决方案中。单个项目使用的包在项目级别文件packages.config中引用。
现在,当同事从源代码管理系统(例如TFS)检索您的解决方案并构建解决方案时,包应该自动被检索(从NuGet),并且解决方案应该能工作。这是Visual的默认行为。然而,选择退出自动检索作为在此描述是可能的.如果您,或您的同事选择退出,包将不会被检索,解决方案不会因为缺少引用而构建。
然后, bin文件夹
bin文件夹是Visual将放置已编译解决方案的文件夹。这意味着,每次构建解决方案时,VS都会清除该文件夹,将源代码编译为程序集,并将已编译的程序集和引用的程序集放在bin文件夹中。
例如,当新的同事从源代码管理中检索您的解决方案时,他将没有bin文件夹。一旦他构建了解决方案,bin文件夹将被创建一个充满生成程序集的文件夹。
最后,修复您的解决方案
若要修复原始问题(Route未识别),请检查是否自动检索NuGet包。备选方案
都应该检查一下。这两个选项都可以在Visual Studio选项中的Package常规设置中使用。
之后,您必须将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。
https://stackoverflow.com/questions/35921642
复制相似问题