幸运的是,你有几个选择。
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。
希望这对您有所帮助!
编辑:请勿使用下面的代码。 它是错误的。 我将其留作不要这样做的示例。
单向操作中不可用服务器变量。
原始答案。 不要使用:请参阅我在EDIT之上更新的答案。
我刚在新的ASP.Net Web Service Application上进行了冒烟测试。 从我可以访问的每个端点都可以工作。
HttpRequest.UserHostAddress是获取客户端IP地址的文档方式。 如果这对您不起作用,我会寻找根本原因。
[WebMethod]
[SoapDocumentMethod(OneWay = true)]
public void Silent()
{
var address = HttpContext.Current.Request.UserHostAddress;
Trace.Write(address);
}