【问题标题】:Web Api - How to automatically transform to lowercase url parametersWeb Api - 如何自动转换为小写 url 参数
【发布时间】:2015-07-03 13:34:25
【问题描述】:

我有以下配置的路线:

routes.MapHttpRoute("oneKey",
                    "{controller}/{id}");

如果我转到端点/users/Maticicero,路由将正确委派给我的UsersController 类中的GET 方法。

但是,我得到的是 id 参数,就像输入的一样,例如 Maticicero。 由于这是我的数据库的主键,并且比较区分大小写,我需要将我的 id 规范化为小写,即:

id = id.ToLower()

我必须在每个控制器和每个采用id 参数的方法中执行此操作。

有没有办法告诉我的 Web Api(或路由处理程序)自动将这些参数(或整个 url)小写?

【问题讨论】:

  • @naveen 这是一个路由约束。它不会修改值,如果不是小写,它将无法匹配路由。这不是 OP 要求的。
  • 是的。我想还是困了。删除评论:)
  • 为什么不使用在查找中不会混淆的主键。例如 INT 或 GUID。如果您需要搜索名称,请使用Name LIKE '%name%'
  • @Xenolightning 我们目前使用 AWS DynamoDB 作为我们的持久化策略。虽然使用 int 键是可行的,但服务器将负责生成关联的 id(因为 DynamoDB 不支持自动增量键),这将使我们为每个用户创建一个 GUID,这些用户会弄乱 URL。为此,我们选择了用户名作为主键(它也符合用户名必须唯一的要求)
  • @MatiCicero 您是否直接从控制器查询 DynamoDb?如果是这样,您可能需要考虑在数据访问上使用存储库。它将允许您为 Db 查询实现一致的逻辑。 Controller -> UserRepository (call ToLower here) -> DynamoDb。仅依靠 WebApi 为您提供字符串的正确大小写是非常脆弱的代码。

标签: c# asp.net asp.net-web-api


【解决方案1】:

在注册路线时尝试使用routes.LowercaseUrls = true;MSDN

RouteCollection.LowercaseUrls: 获取或设置一个值,该值指示是否将 URL 转换为 虚拟路径标准化时小写。

但是当你像这样使用你的请求时要小心http://host/controller?id=Maticicero

如果 URL 中包含查询字符串,则 URL 的该部分不是 转换为小写。

还可以看看这个 SO 问题:How can I have lowercase routes in ASP.NET MVC?

【讨论】:

  • 不幸的是,我使用的是 ASP.NET Web Api 而不是 MVC,所以我得到了一个 HttpRouteCollections 而不是你提到的 RouteCollections。该类没有此属性:(
【解决方案2】:

您可以在Application_BeginRequest事件中捕获URL,解析该URL,并使用HttpContext.RewritePath修改原始URL。

https://msdn.microsoft.com/en-us/library/sa5wkk6d(v=vs.110).aspx

【讨论】:

  • 今天要试试这个并随时通知您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 2015-09-03
  • 2023-04-07
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多