【问题标题】:How do I get the local port number of an HttpWebRequest?如何获取 HttpWebRequest 的本地端口号?
【发布时间】:2012-06-28 01:04:35
【问题描述】:

我正在使用 HttpWebRequest 异步发出一个长时间运行的请求。在请求运行时,我希望能够获取请求的本地端口(即客户端上的端口,而不是服务器上的端口)。我怎么做?

我查看了 HttpWebRequest.ServicePoint.BindIPEndPointDelegate,但这似乎只允许调用者指定本地地址/端口。理想情况下,我想让 HttpWebRequest 正常选择其本地端口,然后询问它选择了什么。

【问题讨论】:

  • 只是好奇你为什么想知道这个。
  • 我正在滥用 HTTP 来创建通知机制。我想知道端口,以便其他流可以告诉服务器哪个通知通道是他们的。
  • 但是您是否考虑过其他的 over-HTTP 机制?比如WCF。 HttpWebRequest 的另一端是什么?
  • 我正在使用不提供 WCF 接口的现有应用程序。

标签: c# .net httpwebrequest httpwebresponse


【解决方案1】:

不幸的是,HttpWebRequest 类确实没有公开您的要求。

我不建议在生产中使用我将在下面说的内容。这只是程序员的乐趣

ServicePoint 类有一个名为 m_NetworkStream 的私有 NetworkStream 成员,通过 internal 属性 NetworkStream 公开。

您可能已经知道,NetworkStream 已经公开了一个公共 Socket 属性,该属性为您提供了底层套接字,您可以从中访问本地 IP 端点。

因此唯一的挑战是获取ServicePoint.NetworkStreamPropertyInfo,获取特定HttpWebRequest 实例的值,然后从那里得到一条直线。

注意:对于正确的解决方案,您可能需要查看Windows HTTP Services,然后可能围绕它创建一个托管包装器(如果还没有的话)。

享受吧!

【讨论】:

  • 我总是喜欢一点程序员的乐趣,但深深地反映这一点感觉有点肮脏。 :)
  • @Erigam:当然它很脏,没有争议。我已经提到过,这不能用于生产。
  • @MarcelNita 枚举 ServicePoint 的属性我没有看到您正在谈论的 NetworkStream 属性。我有 BindingFlags.Instance | BindingFlags.NonPublic 集。
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多