WebAPI AttributeRouting,版本号为参数

时间:2016-07-21 14:41:09

标签: asp.net-mvc-4 asp.net-web-api attributerouting

我正在尝试使用以下模板设置到MVC控制器操作的路由:

[Route("app/{appId:length(20)}/validate/{version}")]

这个想法是生成的URL看起来像这样: (我添加了一个空格以使localhost url尝试不解析...)

  

http:/ / localhost:2.642 / api / update / v1 / app / 6A6EE0B355C34DBFB381 / validate / 1.0.0.0

我遇到的问题是这会给我404错误。

如果我删除Route属性并使用内置的MVC路由,它可以工作。然后网址是:

  

http://localhost:2642/api/external/CheckForUpdate?appId=6A6EE0B355C34DBFB381&version=1.0.0.0

这应该有效,因为我知道Nuget在他们的URL中有版本,但我认为他们使用内置的MVC路由器。

我还尝试在路径的模板中添加:regex()标记,以便验证字符串格式,但这不起作用。如果我传入一个普通字符串或一个值,如1_0_0_0,它就可以工作。事情是我不想在将版本字符串发送到api然后再发送到api本身之前完成操作版本字符串的工作。

关于我做错的任何想法?

1 个答案:

答案 0 :(得分:1)

如果您制作路线属性

[Route("app/{appId:length(20)}/validate/{version:regex(^([1-9]\\d+|[0-7])(\\.\\d{1,3}){0,3}$)}")]

并确保您接受方法

中的参数
public Task<IHttpActionResult> Get(string appId, string version)
{
    //magic
}

然后在web.config,system.webServer&gt;处理程序部分将*.更改为*

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

并确保

<modules runAllManagedModulesForAllRequests="true">

存在于<system.webServer>