Asp.net web api 在id中斜杠时删除时发生HTTP方法不允许(405)

Asp.net web api 在id中斜杠时删除时发生HTTP方法不允许(405),asp.net-web-api,asp.net-web-api-routing,Asp.net Web Api,Asp.net Web Api Routing,这是路由配置: config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "{clientId}/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); 控制器方法的方法签名: // DELETE public void De

这是路由配置:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{clientId}/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
控制器方法的方法签名:

    // DELETE
    public void Delete(string clientId, string id)
到目前为止,除了类型为string的id之外,几乎都是标准的

在id包含斜杠之前,一切正常:MI-01/02

因此HTTP请求如下所示:

DELETE http://de2sv034.xnet.oe.olympus/corporate/ExtraNet/API/dev/M01/Products/MI-01/02
Web API发出HTTP状态代码405(不允许使用方法)。客户端上的System.Uri.EscapeDataString没有帮助,因为斜杠没有被转义


即使id包含斜杠,如何正确映射路由?

如果直接在URI内将
id
指定为
查询字符串
参数(它甚至不需要URL编码),这将起作用。例如,在您的案例中类似这样的内容:
../Products?id=MI-01/02


它之所以有效,是因为问号(
)之后的任何内容都不再被解释为主路径的一部分,而是被解释为查询字符串参数(如果有多个参数,则这些参数由一个符号和
&
分隔)。有关参数绑定的详细信息,请参阅。

是否尝试使用
%2f
转义斜杠?因为它是一个路径分隔符,所以它永远不会像那样独立工作。我刚刚用Fiddler Composer尝试过,但不幸的是,服务器端仍然发出405。在映射发生之前,IIS或ASP.NET似乎正在将%2f解码回斜杠。如果您在uri中指定它如何?例如:
../Products?id=“MI-01/02”
(不确定是否需要双引号)。是的,使用id作为查询参数,即使没有双引号,它也可以工作。因此,我将相应地更改客户端代码。非常感谢。