【问题标题】:.Net core Routing URLEncoded URL not working.Net 核心路由 URLEncoded URL 不起作用
【发布时间】:2023-03-07 11:06:01
【问题描述】:

我有一个 .Net core 2.2 WebAPI,它可以与“普通”样式的 URL 完美配合,例如/api/controller/action/param 等。我有一个 3rd 方服务,它使用 URL 编码路径对此 API 进行 POST,并且 Asp.Net 路由无法正确路由此请求。

控制器位于:.../api/file/uploadFile/{filename}

来自第 3 方的 POST 是: “.../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("api/[controller]/[action]")]
[Route("api%2F[controller]%2F[action]")]
public class FileController : Controller
{
  ...
}

我原以为 .Net 核心路由引擎会检测路径

【问题讨论】:

    标签: asp.net asp.net-core asp.net-web-api


    【解决方案1】:

    路由生成的url中的默认路径分隔符是/。问题似乎是作为路径值一部分的参数之前的分隔符无法识别或丢失。

    如果你请求像.../api%2Ffile%2FuploadFile%2FMaintenanceReport_2019_08_05_17_11_10.html.gz这样的url,你可以尝试使用如下的URL重写中间件:

    1. 在配置中

      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://docs.microsoft.com/en-us/aspnet/core/fundamentals/url-rewriting?view=aspnetcore-2.1&tabs=aspnetcore2x

    【讨论】:

    • 谢谢你,为我解决了这个问题。
    猜你喜欢
    • 2018-08-09
    • 2018-07-06
    • 2013-09-01
    • 2017-06-03
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多