【问题标题】:WebAPI AttributeRouting with version number as parameter以版本号为参数的 WebAPI AttributeRouting
【发布时间】:2026-02-04 15:15:01
【问题描述】:

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

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

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

http://localhost:2642/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 本身之前对其进行操作。

关于我做错了什么有什么想法吗?

【问题讨论】:

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


    【解决方案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 > handlers 部分将*. 更改为*

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

    存在于&lt;system.webServer&gt;

    【讨论】:

    • 我现在取出了正则表达式部分,因为这似乎也给出了 404 结果。这不是世界末日,但它现在确实有效。
    • 我测试了它并且它工作正常,如果你把 web.config 的方法签名和 webserver 部分的更多细节放在一起,可能会很突出