以版本号作为参数的 WebAPI AttributeRouting

WebAPI AttributeRouting with version number as parameter

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

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

想法是结果 URL 看起来像这样: (我正在添加 space 以使本地主机 url 尝试不解析...)

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

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

如果我删除 Route 属性并使用内置的 MVC 路由,它就可以工作。 url 则为:

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

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

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

对我做错了什么有什么想法吗?

如果你让你的路由属性

[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 > 处理程序部分将 *. 更改为 *

<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>