在 ASP.NET 编码的引号中阻止请求到达路由

In ASP.NET encoded quotes prevent request from reaching the route

在 ASP.NET 中编码的引号阻止请求到达路由。我该如何解决这个问题?

就我而言,问题如下。

我正在发出请求:https://localhost:44364/api/businessAttributes/contractors/foo 并且请求到达了我的控制器:我能够调试控制器并且看到一切正常。我也收到回复:[{"code":"1code","title":"\"foo\" short (1code)","id":"1code"}].

然后我尝试以下请求:https://localhost:44364/api/businessAttributes/contractors/%22foo%22 但请求根本没有到达我的控制器。

这是我在 BE 上的路线:

    [HttpGet]
    [Route("api/businessAttributes/contractors/{searchString?}")]
    public async Task<IEnumerable<BusinessAttributeSimpleListEntryDto>> GetContractors(string searchString = null)

我在这里错过了什么?

解决我能找到的问题的唯一方法是将控制器更改为

    [HttpGet]
    [Route("api/businessAttributes/contractors")]
    public async Task<IEnumerable<BusinessAttributeSimpleListEntryDto>> GetContractors([FromUri]string searchString = null)

并请求 https://localhost:44364/api/businessAttributes/contractors?searchString=%22foo%22

有没有更好的方法来解决这个问题?

更新

根据评论部分的建议,我尝试将 / 附加到请求的末尾,以获得以下请求:https://localhost:44364/api/businessAttributes/contractors/%22foo%22/。那没有帮助。

您必须 url 将 " 编码为 %22

您可以简单地使用 EscapeUriString

string encodedUrl = Uri.EscapeUriString(url);

到达终点后,您的 searchString 将是 "\"foo\"""foo",而不是 foo。确保你处理好。