.NET core路由URLEncoded URL不起作用

3
我有一个 .Net core 2.2 的 WebAPI,使用“正常”样式的URL(如 /api/controller/action/param 等)可以完美地工作。我有一个第三方服务,它会以 URL 编码路径的形式 POST 到这个 API,但 Asp.Net 路由不能正确路由此请求。
控制器位于:.../api/file/uploadFile/{filename}
第三方 POST 的 URL 为:".../api%2Ffile%2FuploadFile%2FMaintenanceReport_2019_08_05_17_11_10.html.gz"。
将路径中的 %2F 替换为 "/" 可正常工作: ".../api/file/uploadFile/MaintenanceReport_2019_08_05_17_11_10.html.gz"
文件名是:“MaintenanceReport_2019_08_05_17_11_10.html.gz”
在路径中加入带有 %2F 的 Route 属性似乎可以工作,但看起来非常混乱。
传递给路径的文件名也无法正确解析为参数。我怀疑这是由于包括文件扩展名。
我已经搜索了网络,没有找到任何相关的信息。有什么建议/想法吗?
[Route("api/[controller]/[action]")]
[Route("api%2F[controller]%2F[action]")]
public class FileController : Controller
{
  ...
}

我原本以为 .Net Core 路由引擎会检测路径。
1个回答

2
路由生成的URL中默认的路径分隔符是/。问题似乎在于未识别或缺少作为路径值一部分的参数前面的分隔符。
如果您请求的URL类似于.../api%2Ffile%2FuploadFile%2FMaintenanceReport_2019_08_05_17_11_10.html.gz,您可以尝试使用以下URL重写中间件:
  1. In Configure

    app.UseRewriter(new RewriteOptions()
                .Add(RewriteRouteRules.ReWriteRequests)
                );
    

2. 自定义一个包含 ReWriteRequests 的类


public class RewriteRouteRules
{
    public static void ReWriteRequests(RewriteContext context)
    {
        var request = context.HttpContext.Request;

        if (request.Path.Value.Contains("%2F", StringComparison.OrdinalIgnoreCase))
        {
            context.HttpContext.Request.Path = context.HttpContext.Request.Path.Value.Replace("%2F", "/");
        }

    }
}

参考文献: https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/url-rewriting?view=aspnetcore-2.1&tabs=aspnetcore2x

原始答案翻译成“最初的回答”。本文介绍了ASP.NET Core中URL重写的基础知识,包括如何配置和使用URL重写中间件。通过URL重写,可以更改应用程序的URL结构,以提高用户体验和搜索引擎优化。


谢谢,这为我解决了问题。 - QuentinInSA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接