如何在.NET 7的C#极简Web API中获取完整请求URL?
在全新的.NET 7.0框架中,情况变化很大。这类问题之前被提过无数次,但因为.NET Core打破了向后兼容性,旧的针对.NET 4.9及更早版本的答案已经完全不适用了。
我在开发一个极简Web API,需要把完整请求URL作为字符串存入数据库做日志记录(还会附带其他信息)。我用的是ASP.NET Core的HttpContext类(不是System.Web下的HttpContext),它的Request属性是HttpRequest类型,但这个类没有直接获取原始请求URL的方法,只能拿到各个组成部分,自己拼接的话又没法保证和原始URI完全一致。
以前实用的Request.Url已经被彻底移除,而DisplayUrl助手方法也没法提供完整信息——它会漏掉QueryString,而这正是我需要的部分。
当然我可以自己拼接这些部分得到URL,但总觉得不太妥当,而且这种方式生成的URI更适合返回给响应头,我需要的是原始URL原样存入数据库做日志。
没办法,尽管这类问题已经被问过很多次,还是得再提一次,就因为最新的.NET更新又把原有功能打破了。
我开发的是多租户应用,运行在多个域名(包括通配符子域名)上,用来分析新注册域名的流量。整个API只会返回404错误,但我需要记录完整URL,判断域名是否收到异常请求——比如黑客尝试访问https://owa.example.com/wp-booking.php或https://forum.example.com/default.aspx?g=rsstopic&pg=0&ft=0这类地址。我还会记录请求体、请求方法、用户IP地址和请求头,用来扩展恶意用户黑名单。
这些域名刚解除限制,处于待开发或被接管的状态,返回404可以告诉用户(包括黑客)站点已不存在。大部分用户会知道站点关闭并停止访问,但自动化工具和黑客工具可能还会发起请求,这些日志能帮我了解他们的操作意图。
无论如何,我需要客户端发送给服务器的完整URL,包括查询字符串、域名、协议以及所有相关信息。但.NET 7偏偏不让我直接访问原始URL,这太不合理了。整个项目本质上就是一个app.Run()语句,记录请求后始终返回404,API响应慢一点完全没关系。
唉……以前Request.Url.AbsoluteUri这么好用的函数,现在被移除后,过去14年左右的相关答案全失效了——现在Request连Url属性都没有了。
内容的提问来源于stack exchange,提问作者Wim ten Brink

