这不是一篇教你了解WebService的博文,也不是对WebService的深入理解, 这是一篇教你在开发过程中,如果动态的调用WebService一个方法.

在比较常见的WebService调用,我们一般是选择在项目中,新建添加引用的方式来引用WebService服务. 例如下面的方式 :

1 : 在项目中新建添加服务引用

2 : 输入引用服务器的地址

然后我们的程序集下就会多出刚才新建的Service 引用相关的文件引用.

然后我们就可以直接在代码中调用ServiceReference1 , 就可以了,在这里就不在继续的详细做解释说明了,我们还是回到主题,如何减去这些步骤,因为这样的方式添加引用,1 : 不好扩展, 2 : 比较繁琐

下面介绍一种方式用来动态的调用WebService References :

一 : 在项目中右键选择新建

然后我们修改Component类本部.

我们添加完成之后,Component类内部默认为:

publicpartialclassComponent1:Component{publicComponent1(){InitializeComponent();}publicComponent1(IContainercontainer){container.Add(this);InitializeComponent();}}


在此我们需要做一些修改.

首先在项目中添加WebService的引用.

然后将Component类 继承自SoapHttpClientProtocol

至此将Component类改为 :

[WebServiceBinding(Namespace="http://tempuri.org/")]publicpartialclassComponent1:SoapHttpClientProtocol{publicComponent1(){InitializeComponent();}publicComponent1(IContainercontainer){container.Add(this);InitializeComponent();}}

SoapHttpClientProtocolSoapHttpClientProtocol类可以直接访问指定的webService的指定方法

若要与 XML Web services 通信,请为要调用的 XML Web services 创建一个间接或直接从WebClientProtocol派生的代理类。可以不用手动创建代理类,而使用 Web 服务描述语言工具 (Wsdl.exe) 为给定 XML Web services 的服务说明创建代理类。当为 SOAP 协议生成代理类时,对 XML Web services 方法的同步调用通过Invoke方法进行,而异步调用通过BeginInvoke方法和EndInvoke方法进行。

然后在配置文件中写入我们所要引用的服务器链接地址 :

<addkey="ServiceAddress"value="http://localhost:7340/CourseMakerService.asmx"/>

在我们添加的Conponent Class 构造中调用服务器链接地址

publicComponent1(stringserviceUrl){if(serviceUrl.Equals("UpdateServiceAddress"))base.Url=ConfigurationManager.AppSettings["UpdateServiceAddress"];elsebase.Url=ConfigurationManager.AppSettings["ServiceAddress"];}


然后当我们想要调用WebService中的方法时,只需要在Component1类中写.

如我的调用方式 :

[WebServiceBinding(Namespace="http://tempuri.org/")]publicclassOffLineLearingClient:SoapHttpClientProtocol{publicOffLineLearingClient(stringserviceUrl){if(serviceUrl.Equals("UpdateServiceAddress"))base.Url=ConfigurationManager.AppSettings["UpdateServiceAddress"];elsebase.Url=ConfigurationManager.AppSettings["ServiceAddress"];}publicOffLineLearingClient(){base.Url=ConfigurationManager.AppSettings["ServiceAddress"];}[SoapDocumentMethod]publicYHBJUserGetUser(YHBJUseruser){returnbase.Invoke("GetUser",newobject[]{user})[0]asYHBJUser;}[SoapDocumentMethod]publicList<YHBJClass>GetTrainings11(stringuserId){returnbase.Invoke("GetTrainings11",newobject[]{userId})[0]asList<YHBJClass>;}


这样我们就可以动态的实现如果调用WebService了.