首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在WCF 3.0中获取客户端IP地址

在 WCF 3.0 中,可以通过实现 IDependencyContext 和 IRequestChannel 来获取客户端的 IP 地址。以下是实现代码:

在客户端:

代码语言:csharp
复制
public class Client
{
    static void Main(string[] args)
    {
        using (var scope = new TransactionScope())
        {
            using (var channel = new TcpClientChannel())
            {
                var endpoint = new EndpointAddress("http://localhost/Service");
                var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
                channel.Endpoint.Binding = binding;
                channel.Endpoint.Address = endpoint;

                channel.Credentials.ClientCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
                channel.MaxChannels = 1000;
                channel.OperationTimeout = TimeSpan.FromMinutes(60);
                channel.Open();

                IDependencyResolver resolver = new XmlServiceHostFactory();
                var service = resolver.GetService<IServiceImplementation>();
                service.DoWork();
            }
        }
    }
}

客户端代码使用了一个 TCP 客户端 Channel 来与服务端创建一个网络连接。服务端通过在配置文件(Web.config)中添加一个 EndpointAddress 的值来指定了服务所在的地址和端口号。

客户端还使用一个名为“BasicHttpBinding”的 Binding 对象指定了基本 HTTP 绑定。它使用一个名为“BasicHttpSecurityMode”的可选属性值,该属性值指示是否只使用 TransportCredentialOnly 安全模式。这里我们将其设置为“TransportCredentialOnly”,这意味着客户端将不使用基本安全认证和授权服务中的任何用户证书或 Windows 身份验证提供程序。

最后,客户端将配置最大通道数和操作超时时间。在服务端中,我们将客户端 IP 地址通过一个名为 DependencyContext 的属性存储以便其他服务可以通过 DI 容器访问它。

在服务端:

代码语言:csharp
复制
public interface IService
{
    int DoWork();
}

public class ServiceImplementation : IService
{
    public int DoWork()
    {
        IPAddress ip;

        using (var tcpClientChannel = new TcpClientChannel())
        {
            var endpointAddress = "http://localhost/";
            var endpoint = new EndpointAddress(endpointAddress);
            tcpClientChannel.Endpoint.Address = endpoint;
            tcpClientChannel.Endpoint.Binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
            tcpClientChannel.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
            tcpClientChannel.MaxChannels = 1000;
            tcpClientChannel.Open();

            using (var scope = new TransactionScope())
            {
                tcpClientChannel.OperationTimeout = TimeSpan.FromMinutes(60);
                var serviceEndpointAddress = "http://localhost/Endpoint";
                var endpointAddressBuilder = new UriBuilder(serviceEndpointAddress);
                endpointAddressBuilder.Port = int.Parse(endpointAddressBuilder.Port, StringComparison.OrdinalIgnoreCase);
                var endpointBuilder = new UriBuilder(new Uri(serviceEndpointAddress));
                serviceEndpointAddress = endpointBuilder.ToString();
                using (var channel = new EndpointChannel())
                {
                    channel.Contract.Namespace = "myNamespace";
                    channel.Contract.ContractType = typeof(IServiceImplementation);
                    channel.Contract.Address = endpointAddress;

                    var resolver = new ServiceHostResolver() { ServiceAddress = endpointAddress };
                    var host = new ServiceHost(typeof(IServiceImplementation), new Uri(serviceEndpointAddress), new UriBuilder(), resolver);

                    host.Description.Behaviors.Add("ServiceEndpoint", new ServiceRoute(new AddressFilterBehavior()));
                    host.AddServiceEndpoint(new ServiceEndpoint((ChannelBinding)_serviceEndpoint.Binding, new Contract[] { new Contract((Binding)_serviceEndpoint.Binding, new EndpointAddress(_serviceEndpoint.Address)) }, ServiceMetadata.GetMetadataAssembly(), _serviceEndpoint.Address));

                    var dependenceContext = new DependecnyContext(host, tcpClientChannel, resolver);

                    ServiceDebugBehavior serviceDebugBehavior = new ServiceDebugBehavior
                    {
                        ClientConfig = new ServiceDebugClientBehavior
                        {
                            ClientCertificateMode = ClientCertificateMode.UseCertificateOnRemoteMachine,
                            MaxConcurrentCalls = 1000,
                            MaxConcurrentInstances = 1000,
                            PropagateConsoleMessages = false,
                            ServiceCertificate = new ClientCertificateBindingElement()
                            {
                                //ServiceCertificate = new X509ReportingBehavior(),
                                SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11
                            }
                        }
                    };
                    host.Description.Endpoints.Clear();
                    host.Description.Endpoints.Add(new ServiceEndpoint(contract.ContractType, binding.Binding, new PhysicalAddress("0.0.0.0") + endpointAddress, new Uri("http:" + endpointAddress), serviceDebugBehavior));
                    ContractOperationsContractExtensions.ContractOperations.Add(serviceEndpoint, new ChannelServicesContractOperations());
                    ChannelServices.InitializeContractDescription(serviceEndpoint, contract);

. . .

var ip = dependenceContext.Endpoints.First().Address.ToString();
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PHP获取客户端IP地址方式

一、如果没有使用代理服务器 REMOTE_ADDR = 客户端IP HTTP_X_FORWARDED_FOR = 没数值或不显示 $ip = $_SERVER['REMOTE_ADDR']; 二...、使用透明代理 REMOTE_ADDR = 最后一个代理服务器 IP HTTP_X_FORWARDED_FOR = 客户端真实 IP (经过多个代理服务器时,这个值类似:221.5.252.160, 203.98.182.163..., 203.129.72.215)   这类代理还会将客户真实ip发送到请求对象,无法隐藏真实ip。...= 代理服务器 IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215)   这样就隐藏了客户端的真实ip,但服务器会知道客户端是通过代理服务器去访问的...因此PHP使用_SERVER["REMOTE_ADDR"] 、 PHP获取ip代码如下: public function ip() { //strcasecmp 比较两个字符,不区分大小写。

5.1K20

iOS 获取 IP 地址方法iOS 获取 IP 地址方法

一直以来我们获取IP地址方法都是直接百度一查,或者老代码里就已经存在这部分代码然后直接使用。...Xcode 9和之后更高版本中,你可以使用这个检查来检测从一个错位的指针读取或写入,或者当你创建一个错位的引用时,如果一个指针的地址不是其类型对齐的倍数,那么它就会出现错位。...序列化或反序列化数据的代码中,经常发生违反对齐方式的情况。通过使用保留数据对齐的序列化格式来避免这个问题。...所以综上还是建议使用方式二来获取ID地址(都是本地地址),要获取公网地址可以使用淘宝的API: - (NSString *)getNetworkIPAddress { //方式一:淘宝api...error:nil]; NSString *ipStr = nil; if (ipDic && [ipDic[@"code"] integerValue] == 0) { //获取成功

7.3K21

获取客户端真实 IP 地址的最佳实践

架构调整后,由于未能 100% 覆盖测试,导致漏测的服务经常拿到错误的客户端 IP 地址,造成的后果是损失大量的用户。...代理必须向下传递客户端 IP 地址原因:从入口流量开始,经过 N 层代理,如果代理中间不传递客户端IP 地址,底层业务必然获取不到客户端的真实 IP 地址。2....统一使用 nginx 的 realip 模块获取客户端 IP 地址# nginx.conf# ...set_real_ip_from 腾讯云/阿里云 NAT 出口网段;set_real_ip_from...(proxy)那么,我们只需启用 realip 模块的 real_ip_recursive 递归模式,将从右往左逐步剔除 IP2,IP1 等信任代理,最后会获取到真实的客户端 IP 地址。...按照这个思路,如果边缘节点拿到了客户端 IP,重置 X-FORWARDED-FOR 头部为客户端 IP 地址,并转发到下游,业务只获取第一个 IP 地址,理论上也不会被伪造,业务也简单,为什么不采用?

78750

获取本机IP地址(自动获取不了ip地址怎么解决)

文章目录 获取本机IP地址的方法总结 一、Windows电脑 获取本机 IP 地址 1.命令行获取 2.使用网络状态查看IP地址 二、Mac 电脑获取本机 IP 地址 1. mac电脑要输入**ifconfig...** 获取本机IP地址的方法总结 一、Windows电脑 获取本机 IP 地址 1.命令行获取 第一步:在任意位置同时按下 windows键 + r键, 第二步:回车键 或者 点击确定...第三步:输入ipconfig 然后回车 箭头所指的位置就是你本机的IP咯~ 2.使用网络状态查看IP地址 第一步:进入“网络和共享中心”(控制面板可以进入,右单击左下角那个网络图标也可以进入...),然后再点击已链接的网络,如图 第二步:完成第一步后,就进入了“网络连接状态”窗口,点击“详细信息” 第三步:详细列表里我们就可以看到网络的详细IP配置信息,如图 二、Mac...电脑获取本机 IP 地址 1. mac电脑要输入ifconfig 注意: 一个是p,一个是f 注意: 一个是p,一个是f 注意: 一个是p,一个是f 圈起来的位置就是你本机的IP咯~ 发布者

11K30

PHP 获取客户端 IP 地址的方法实例代码

先来了解一个变量的含义: $_SERVER[‘REMOTE_ADDR’]:浏览当前页面的用户计算机的ip地址 $_SERVER[‘HTTP_CLIENT_IP’]:客户端ip $_SERVER[‘HTTP_X_FORWARDED_FOR...’]:浏览当前页面的用户计算机的网关 $_SERVER[‘HTTP_X_REAL_IP’]:nginx 代理模式下,获取客户端真实IP /** * 获取客户端IP地址 */ function real_ip...['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['HTTP_CF_CONNECTING_IP...-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_IP'])) { $ip = $_SERVER['HTTP_X_REAL_IP']; }...return $ip; } 总结 以上所述是小编给大家介绍的PHP 获取客户端 IP 地址的方法实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

4.6K10

PHP 获取客户端 IP 地址的办法实例代码

先来了解一个变量的含义: $_SERVER[‘REMOTE_ADDR’]:浏览当前页面的用户计算机的ip地址 $_SERVER[‘HTTP_CLIENT_IP’]:客户端ip $_SERVER[‘HTTP_X_FORWARDED_FOR...’]:浏览当前页面的用户计算机的网关 $_SERVER[‘HTTP_X_REAL_IP’]:nginx 代理模式下,获取客户端真实IP /** * 获取客户端IP地址 */ function real_ip...'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['HTTP_CF_CONNECTING_IP']) &&....){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_IP'])) { $ip = $_SERVER['HTTP_X_REAL_IP']; } return...$ip; } 总结 以上所述是小编给大家介绍的PHP 获取客户端 IP 地址的办法实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

2.2K21

Nginx反向代理及获取真实的客户端IP地址

然而,这种设计也带来了一个问题:后端服务器无法获取到真实的客户端 IP 地址很多应用中,获取真实的客户端 IP 地址是非常重要的,例如,进行地理定位、检测欺诈行为、限制访问速率等。...结论使用 Nginx 反向代理时,通过正确的配置,我们可以很方便地获取到真实的客户端 IP 地址。...使用以下命令来重启 Nginx:sudo service nginx restart或者sudo systemctl reload nginx Java 中获取真实的客户端 IP 地址有了 Nginx...的正确配置,我们就可以在后端应用中获取到真实的客户端 IP 地址。...通过正确的 Nginx 配置以及在后端应用中适当的处理,我们可以获取到真实的客户端 IP 地址,这对于用户行为分析和安全审查都是非常重要的。构建网络应用时,了解如何处理这种问题是非常有用的。

8K30
领券