wcf 动态调用

转载 2017年08月07日 10:42:01

客户端调用wcf ,有时需要动态的调用服务端的WCF中的方法,本方法,反射wcf 的接口,动态调用接口中的方法。

主要为,动态绑定,反射动态调用。 

      public static object ExecuteMethod<T>(string pUrl, string pMethodName, params object[] pParams)
        {
            EndpointAddress address = new EndpointAddress(pUrl);
            Binding bindinginstance = null;
            NetTcpBinding ws = new NetTcpBinding();
            ws.MaxReceivedMessageSize = 20971520;
            ws.Security.Mode = SecurityMode.None;
            bindinginstance = ws;
            using (ChannelFactory<T> channel = new ChannelFactory<T>(bindinginstance, address))
            {
                T instance = channel.CreateChannel();
                using (instance as IDisposable)
                {
                    try
                    {
                        Type type = typeof(T);
                        MethodInfo mi = type.GetMethod(pMethodName);
                        return mi.Invoke(instance, pParams);
                    }
                    catch (TimeoutException)
                    {
                        (instance as ICommunicationObject).Abort();
                        throw;
                    }
                    catch (CommunicationException)
                    {
                        (instance as ICommunicationObject).Abort();
                        throw;
                    }
                    catch (Exception vErr)
                    {
                        (instance as ICommunicationObject).Abort();
                        throw;
                    }
                }
            }
        }



本文使用的是nettcpbinding 绑定方式,可修改。

调用方法使用

ExecuteMethod<IService>("net.tcp://192.168.0.1:8001/mex", "Test", new object[] { "参数" })



动态调用WCF服务,只需要提供*.svc地址,

1:命名空间:

using System.ServiceModel.Channels;
using System.ServiceModel;

2:创建访问类InvokeContext

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);
return factory.CreateChannel();
}
#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.MaxReceivedMessageSize = 65535000;
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

}

3.T为调用的接口类型,就是WCF返回的类的实例,由于我的WCF是基于接口的,所以加了一个接品类型判断,调用时直接写:Interface iface = InvokeContext.CreateWCFServiceByURL<Interface>(url);

动态调用WCF地址 (使用ChannelFactory类)

动态调用WCF地址 (使用ChannelFactory类) 最近在做的一个项目中需要动态调用WCF地址,因为有很多终端服务器,而每台终端服务器上都部署一个WCF服务,中央服务器需要不定时调用其中...
  • liuruxin
  • liuruxin
  • 2013年12月11日 12:04
  • 3936

使用ChannelFactory类实现动态调用WCF地址

最近在做的一个项目中需要动态调用WCF地址,因为有很多终端服务器,而每台终端服务器上都部署一个WCF服务,中央服务器需要不定时调用其中某个或者多个WCF服务执行相关操作,因此添加引用及配置文件配置的方...
  • huyu107
  • huyu107
  • 2016年04月06日 13:23
  • 2366

不引用服务而使用WCF,手动编写客户端代理类

本文将演示如何通过自己手动编写代码来调用WCF服务。首先使用了ChannelFactory来创建通道,并调用与通道关联的服务协定。随后对代码进一步封装,选用从ClientBase类派生,可以更有效地简...
  • tcjiaan
  • tcjiaan
  • 2013年08月09日 16:45
  • 18966

WCF之各种WCF引用方式

写在开头:本文内容来自 WCF全面解析中的一个经典例子,如果你已经看过了,那么可以忽略本文,本文旨在和大家分享不一样的WCF使用方法。 准备工作: 1.创建解决方案WCFService(当然名字可...
  • dyllove98
  • dyllove98
  • 2013年07月30日 18:54
  • 13001

采用axis2方式Java客户端调用WCF服务端Web Service

首先确保WebService服务开启,如下图:
  • yangshijin1988
  • yangshijin1988
  • 2014年08月13日 22:28
  • 2487

Delphi调用WCF异构编程

Delphi调用WCF异构编程, 几年前,就开始使用Delphi进行分布式开发,最早用的方案是Delphi7+Webservice,在简单的应用场景下,也能够满足需求了。目前有一个项目,主要的需求点如...
  • shuaihj
  • shuaihj
  • 2014年01月08日 12:13
  • 6684

Post方式调用wcf服务

我们平常在PC端调用WCF服务,只要知道WCF服务的地址,客户端直接添加引用服务就可以使用了,殊不知还有其他方式,其实,我们也可以 通过HTTP POST的方式调用WCF服务,这样就不用添加引用了,在...
  • zx13525079024
  • zx13525079024
  • 2014年05月26日 12:03
  • 10435

不引用服务而使用WCF,手动编写客户端代理类

我们之所以说WCF比一般的Web Service要强大得多,是因为它要比一般的Web服务要灵活得多,而且它不仅仅能在IIS服务器上运行,其实它可以用很多种方法来运行,哪怕一个控制台应用程序。 现在,...
  • u011854789
  • u011854789
  • 2016年07月11日 10:36
  • 1289

nodejs访问WCF服务

单点登录1.SSO站点地址 http://172.20.112.215 2.WebService地址 http://172.20.112.215/TokenService.svc?ws...
  • u010129985
  • u010129985
  • 2017年03月30日 21:19
  • 634

WCF简单实例--用Winform启动和引用

以订票为例简单应用wcf程序,需要的朋友可以参考下
  • kuui_chiu
  • kuui_chiu
  • 2014年06月04日 11:26
  • 2477
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wcf 动态调用
举报原因:
原因补充:

(最多只允许输入30个字)