【问题标题】:API controller route attribute issueAPI 控制器路由属性问题
【发布时间】:2021-08-12 22:53:30
【问题描述】:

我对 api 控制器属性路由有疑问。 API 接收到一个获取请求,其中包含到路由的扫描条码:"api/[controller]/{userId}/{barcodeId}"。条形码在哪里:0015A765248。

但我们现在有一些采用这种格式的新条形码:BBRT058/639。

我通过调试发现新条形码中额外的/ 导致了问题,因为现在无法访问 API 控制器。

我认为它正在尝试访问控制器:"api/[controller]/{userId}/{barcodeId}/{barcodeID}"

不存在的。是否可以修改 API 控制器路由属性以接受包含附加 / 的barcodeId?

我被告知,以任何方式修改新的条形码样式实际上都不是代码明智的选择。

我考虑过创建一个新的控制器来接受新的条形码:例如"api/[controller]/{userId}/{barcodeIdpart1}/{barcodeIDpart2}"。 但我不确定是否创建一个与当前控制器重复的新控制器,唯一的区别是路由是个好主意。此外,这两种条形码格式将来可能仍会使用。

【问题讨论】:

  • 这能回答你的问题吗? Route parameter with slash "/" in URL
  • 这是 ASP.NET 的答案,而不是 ASP.NET Core。
  • 请记住,这就是发明查询字符串的原因。传递不能在 URL 路径中的数据。

标签: c# api asp.net-core-webapi


【解决方案1】:

我会尝试将“/”替换为“!”要么 ”!!”例如(您可以选择任何您喜欢的符号或组合) - BBRT058!!639 在发送到控制器之前并在操作中用“/”替换回来。

barcodeId = barcodeId.Replace("!!", "/");

如果你不能修改条形码,那么试试这个

Route[("api/[controller]/{userId}/{barcodeId}/{barcodeIdpart2?})"]
public IActionResult GetBarcode(int userId, string barcodeId, string barcodeIdpart2 = null)
{

if  (!string.IsNullOrEmpty(barcodeIdpart2)) barcodeId=barcodeId + "/" + barcodeIdpart2;
....

}

这两种风格都适用

【讨论】:

    【解决方案2】:

    我认为您不需要对您的代码/控制器进行任何更改,并且它似乎是正确的。但是,我建议您在对控制器进行出站调用之前更新客户端以正确地对条形码进行 URL 编码。这将确保控制器正确解析条形码,然后对其进行进一步处理。此外,这还将确保将来正确处理任何其他特殊的非 ASCII 字符。

    这个解决方案并没有真正改变条形码格式,而是在进行出站 HTTP 调用之前对其进行编码,以便通过网络正确传输它。通过破解控制器的替代解决方案通常会导致非标准的脆弱解决方案,因此不推荐使用。

    客户端调用网址

    • 当前:api/controllername/userId/BBRT058/639
    • 建议:api/controllername/userId/BBRT058%2F639

    进一步阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      相关资源
      最近更新 更多