wcf 代理实例
通过过代理调用 wcf服务
using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.ServiceModel; using System.Threading.Tasks; namespace wcfproxy.Common { public interface IProxy { T SetProxy<T>(); } public class Proxy : IProxy { private readonly IProxyOptions _proxyOptions; public Proxy(IOptionsSnapshot<IProxyOptions> proxyOptionsAccessor) { _proxyOptions = proxyOptionsAccessor.Value; } public T SetProxy<T>() { return GetHttpsProxy<T>(); }
//HTTPS 请求 private T GetHttpsProxy<T>() { var bindingHttps = new BasicHttpsBinding(); bindingHttps.UseDefaultWebProxy = false; string proxyAdress = _proxyOptions.ProcyAdress; bindingHttps.ProxyAddress = new Uri(proxyAdress);//代理 bindingHttps.Security.Mode = BasicHttpsSecurityMode.Transport; bindingHttps.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; bindingHttps.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic; var endpointAddress = new EndpointAddress(_proxyOptions.EndpointAddress); var factory = new ChannelFactory<T>(bindingHttps, endpointAddress);
//安全证书 factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new System.ServiceModel.Security.X509ServiceCertificateAuthentication(); factory.Credentials.ServiceCertificate.SslCertificateAuthentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None; var serviceClient = (T)factory.CreateChannel(); return serviceClient; }
//http 请求 private T GetHttpProxy<T>() { var binding = new BasicHttpBinding(); binding.UseDefaultWebProxy = false; string proxyAdress = _proxyOptions.ProcyAdress; binding.ProxyAddress = new Uri(proxyAdress);//代理 binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic; var endpointAddress = new EndpointAddress(_proxyOptions.EndpointAddress); var factory = new ChannelFactory<T>(binding, endpointAddress); var serviceClient = (T)factory.CreateChannel(); return serviceClient; } } public static class Util { public static void SetCertificatePolicy() { ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate; } private static bool RemoteCertificateValidate( object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) { // trust any certificate!!! System.Console.WriteLine("Warning, trust any certificate"); return true; } } }
public class IProxyOptions { /// <summary> /// 代理地址 /// </summary> public string ProcyAdress { get; set; } /// <summary> /// EndpointAddress /// </summary> public string EndpointAddress { get; set; } }