【发布时间】:2014-02-09 20:59:30
【问题描述】:
我正在使用HttpSelfHostServer 托管一个 REST API,我希望在底层基础架构解析之前查看客户端请求的实际原始 url。
如果我理解正确的话:在底层 HttpSelfHostServer 使用 WCF 来接受 HTTP 连接,而后者又使用 HttpListener。
HttpListener 将请求表示为 HttpListenerRequest 的实例,该实例具有有希望的 RawUrl 属性,我怀疑它会携带实际的 url(在解析之前)。
但是,我不知道在使用 HttpSelfHostServer 时是否可以访问底层的 HttpListenerRequest。
由于我无法访问实际的原始网址,因此以下请求在到达我的代码时具有相同的签名:
http://server/a?bhttp://server/a%3fb
但是,我希望它们代表两种不同的资源:
-
a?b应该表示对名为a的资源的查询?b -
a%3fb应该代表一个名为a?b的资源
任何关于我在使用 HttpSelfHostServer 时如何查看实际原始 url 的帮助或关于如何区分这两个请求的任何其他想法都会非常有用。
支持这种命名的 REST API 的一个很好的例子是 Windows Azure 中的 Get Blob API:
http://myaccount.blob.core.windows.net/mycontainer/myblob?timeout=1使用查询参数timeout=1转到名为myblob的 blob。http://myaccount.blob.core.windows.net/mycontainer/myblob%3ftimeout=1转到名为myblob?timeout=1的 blob。
我需要在我的 API 中支持类似的命名方案。
在进一步调查之后,我得出的结论是无法查看原始网址。
这很不幸,因为底层 HttpListenerRequest 的 RawUrl 属性具有我正在寻找的确切值。
如果有人能确认在使用 HttpSelfHostServer 时实际上不可能检索请求的原始 url,那将会很有帮助。
【问题讨论】: