我正在尝试使用以下模板设置到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本身之前完成操作版本字符串的工作。
关于我做错的任何想法?
答案 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>