很多时候,服务地址都不止一个的,这个时候就要动态去配置地址。配置Web.config,很麻烦
下面就看看怎样实现动态调用WCF。
首先看看动态创建服务对象的代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.ServiceModel;
- using System.ServiceModel.Channels;
- /// <summary>
- /// 动态调用WCF的工具类库
- /// </summary>
- public class InvokeContext
- {
- #region Wcf服务工厂
- public static T CreateWCFServiceByURL<T>(string url)
- {
- return CreateWCFServiceByURL<T>(url, "wsHttpBinding");
- }
- public static T CreateWCFServiceByURL<T>(string url, string bing)
- {
- if (string.IsNullOrEmpty(url)) throw new NotSupportedException("this url isn`t Null or Empty!");
- EndpointAddress address = new EndpointAddress(url); //终结点地址
- Binding binding = CreateBinding(bing); 返回一个包含在当前绑定中的已排序的绑定元素集合
- ChannelFactory<T> factory = new ChannelFactory<T>(binding, address); //由通道工厂生成的通道类型。此类型必须
- //为 IOutputChannel 或 IRequestChannel。
- return factory.CreateChannel(); //创建 TChannel 类型(类的泛型参数)的通道。
- }
- #endregion
- #region 创建传输协议
- /// <summary>
- /// 创建传输协议
- /// </summary>
- /// <param name="binding">传输协议名称</param>
- /// <returns></returns>
- private static Binding CreateBinding(string binding)
- {
- Binding bindinginstance = null;
- if (binding.ToLower() == "basichttpbinding")
- {
- BasicHttpBinding ws = new BasicHttpBinding();
- ws.MaxBufferSize = 2147483647;
- ws.MaxBufferPoolSize = 2147483647;
- ws.MaxReceivedMessageSize = 2147483647;
- ws.ReaderQuotas.MaxStringContentLength = 2147483647;
- ws.CloseTimeout = new TimeSpan(0, 10, 0);
- ws.OpenTimeout = new TimeSpan(0, 10, 0);
- ws.ReceiveTimeout = new TimeSpan(0, 10, 0);
- ws.SendTimeout = new TimeSpan(0, 10, 0);
- bindinginstance = ws;
- }
- else if (binding.ToLower() == "netnamedpipebinding")
- {
- NetNamedPipeBinding ws = new NetNamedPipeBinding();
- ws.MaxReceivedMessageSize = 65535000;
- bindinginstance = ws;
- }
- else if (binding.ToLower() == "netpeertcpbinding")
- {
- NetPeerTcpBinding ws = new NetPeerTcpBinding();
- ws.MaxReceivedMessageSize = 65535000;
- bindinginstance = ws;
- }
- else if (binding.ToLower() == "nettcpbinding")
- {
- NetTcpBinding ws = new NetTcpBinding();
- ws.MaxReceivedMessageSize = 65535000;
- ws.Security.Mode = SecurityMode.None;
- bindinginstance = ws;
- }
- else if (binding.ToLower() == "wsdualhttpbinding")
- {
- WSDualHttpBinding ws = new WSDualHttpBinding();
- ws.MaxReceivedMessageSize = 65535000;
- bindinginstance = ws;
- }
- else if (binding.ToLower() == "webhttpbinding")
- {
- //WebHttpBinding ws = new WebHttpBinding();
- //ws.MaxReceivedMessageSize = 65535000;
- //bindinginstance = ws;
- }
- else if (binding.ToLower() == "wsfederationhttpbinding")
- {
- WSFederationHttpBinding ws = new WSFederationHttpBinding();
- ws.MaxReceivedMessageSize = 65535000;
- bindinginstance = ws;
- }
- else if (binding.ToLower() == "wshttpbinding")
- {
- WSHttpBinding ws = new WSHttpBinding(SecurityMode.None);
- ws.MaxReceivedMessageSize = 65535000;
- ws.Security.Message.ClientCredentialType = System.ServiceModel.MessageCredentialType.Windows;
- ws.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Windows;
- bindinginstance = ws;
- }
- return bindinginstance;
- }
- #endregion
- }
IWCFserver 是通过
svcutil.exe http://localhost:8034/WCFserver.svc?wsdl
自动生成的。
- IWCFserver dpser = InvokeContext.CreateWCFServiceByURL<IWCFserver>(Public.getXmlElementValue("LocalDpPathologySliceServ"), "basicHttpBinding");