【发布时间】:2010-09-09 03:27:39
【问题描述】:
我需要找出运行 C# 应用程序的计算机的外部 IP。
在应用程序中,我有一个到服务器的连接(通过 .NET 远程处理)。有没有好办法在服务器端获取客户端的地址?
(我已经编辑了问题,以便更清楚一点。我向所有尽力回答问题的好心人道歉,当时我可能有点太含糊了)
解决方案:
我找到了一种对我很有效的方法。通过在我可以访问 CommonTransportKeys.IPAddress 的地方实现自定义 IServerChannelSinkProvider 和 IServerChannelSink,很容易在 CallContext 上添加客户端 IP。
public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
IMessage requestmessage, ITransportHeaders requestHeaders,
System.IO.Stream requestStream, out IMessage responseMessage,
out ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
{
try
{
// Get the IP address and add it to the call context.
IPAddress ipAddr = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
CallContext.SetData("ClientIP", ipAddr);
}
catch (Exception)
{
}
sinkStack.Push(this, null);
ServerProcessing srvProc = _NextSink.ProcessMessage(sinkStack, requestmessage, requestHeaders,
requestStream, out responseMessage, out responseHeaders, out responseStream);
return srvProc;
}
然后(当我收到来自客户端的请求时)就像这样从 CallContext 获取 IP。
public string GetClientIP()
{
// Get the client IP from the call context.
object data = CallContext.GetData("ClientIP");
// If the data is null or not a string, then return an empty string.
if (data == null || !(data is IPAddress))
return string.Empty;
// Return the data as a string.
return ((IPAddress)data).ToString();
}
我现在可以将 IP 发送回客户端。
【问题讨论】:
-
请定义“外部IP”。它是互联网接口吗?另外,是否有保证的连接性?
-
有保证的连接性。
-
没有“标准化”的方式来查询另一台机器看到你的流量来自的 IP 地址,而不询问它看到你的流量来自哪里的机器。 Calath21 有正确的答案。
-
不是很相关,因为我正在寻找一种通过远程处理(而不是屏幕抓取)来做到这一点的方法。不过还是谢谢。