如何在单向 ASMX Web 服务中获取客户端 IP 地址
本文关键字:获取 客户端 IP 地址 服务 Web ASMX | 更新日期: 2023-09-27 18:35:53
我有一个配置为单向的 Web 服务。或者更确切地说,SoapDocumentMethod 属性具有一个名为"OneWay"的属性。这是为真的。
我正在尝试获取客户端请求的 IP 地址。我得到的事实是,我不会得到确切的IP地址,因为客户端可能落后于其他网络概念。这无关紧要。我想要一个在服务上发起调用的人的 IP 地址,所以如果这是位于某些客户端计算机顶部的某个前端服务器,那就这样吧。
我尝试使用HttpContext,但这似乎不起作用。如果我在运行 Web 服务的同一台计算机上访问我的 Web 服务,则会填充 HttpContext,我可以获取 IP 地址。但是,任何外部使用我的Web服务和HttpContext都有点混乱。在尝试查找有关请求的信息时,它会在许多属性上引发异常。所以我无法获取客户端 IP 地址。如果启用对服务的跟踪,它将开始工作。但这只是暂时的解决方法。这不是一个可接受的解决方案。
那么,当您拥有单向Web服务时,获取客户端IP地址的最佳方法是什么?
我已经看过这里了:http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapdocumentmethodattribute.oneway.aspx
幸运的是,您有一些选择。
1) 将 IP 地址作为参数传递 -->不建议。2) 为 IP 地址创建一个 SOAP 标头,并从客户端传递它
我给你写了一个选项 2 的快速示例。
首先,您需要扩展 SoapHeader 并创建一个类来传递 IP 地址。
using System.Web.Services.Protocols;
namespace SoapHeaders
{
public class IpAddressHeader : SoapHeader
{
public string IpAddress;
}
}
接下来,您需要定义具有该标头的 Web 服务,以及使用它的 Web 方法。
using System;
using System.IO;
using System.Web.Services.Protocols;
using System.Web.Services;
using SoapHeaders;
namespace WebService
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class SoapHeaderService : System.Web.Services.WebService
{
public IpAddressHeader IpAddressHeader;
[WebMethod]
[SoapDocumentMethod(OneWay = true)]
[SoapHeader("IpAddressHeader")]
public void LogIpAddress()
{
var logFile = string.Format(@"C:'Logs'{0:yyyy-MM-dd HH.mm.ss.ffff}.log", DateTime.Now);
string ipAddress;
if (IpAddressHeader == null || string.IsNullOrEmpty(IpAddressHeader.IpAddress))
{
ipAddress = "?";
}
else
{
ipAddress = IpAddressHeader.IpAddress;
}
File.WriteAllText(logFile, string.Format("Client Address --> {0}", ipAddress));
}
}
}
最后,您需要一个客户端来使用服务并传递标头信息。 我刚刚做了一个快速的控制台应用程序,但它可以是任何东西,真的:
using System.Net;
using ConsoleApplication.soapHeaderServices;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
var ipAddressHeader = new IpAddressHeader();
ipAddressHeader.IpAddress = GetIpAddress();
var serviceClient = new SoapHeaderService();
serviceClient.IpAddressHeaderValue = ipAddressHeader;
serviceClient.LogIpAddress();
}
static string GetIpAddress()
{
var ipAddress = "?";
var host = Dns.GetHostEntry(Dns.GetHostName());
foreach (var address in host.AddressList)
{
if (address.AddressFamily.ToString() != "InterNetwork")
{
continue;
}
ipAddress = address.ToString();
break;
}
return ipAddress;
}
}
}
我在远程测试服务上部署了该服务,并从我的电脑调用了它。 工作正常。 创建的日志文件的内容:客户端地址 --> 192.168.1.41
我希望对您有所帮助!
编辑:不要使用我的以下代码。 这是错误的。 我把它作为不该做什么的例子。服务器变量在单向操作中不可用。
原始答案。 请注意使用:请参阅编辑上方的更新答案。
我刚刚在一个新的 Web 服务应用程序上对此进行了烟熏测试 ASP.Net。 从我有权访问的每个端点工作。
HttpRequest.UserHostAddress是获取客户端IP地址的文档方式。 如果这对你不起作用,我会寻找根本原因。
[WebMethod]
[SoapDocumentMethod(OneWay = true)]
public void Silent()
{
var address = HttpContext.Current.Request.UserHostAddress;
// Do something with address
Trace.Write(address);
}