C#调用WebService详细教程:静态与动态引用

5 下载量 79 浏览量 更新于2024-09-01 收藏 134KB PDF 举报
"C# 调用WebService的方法" 在C#开发中,有时需要与远程服务进行交互,这时Web Service成为一种常见的通信方式。本文详细介绍了两种在.NET Framework环境下使用C#调用Web Service的方法:静态引用和服务代理的动态创建。 一、静态引用 静态引用是通过在项目中添加对Web Service的引用来实现调用。首先,你需要创建一个Web Service,定义一些方法,例如一个没有参数的`HelloWorld`方法和一个带参数的`Test`方法。将Web Service部署到IIS并确保其可被访问。 在Winform或Console应用程序中,你可以通过以下步骤添加对Web Service的静态引用: 1. 在项目上选择“添加引用”。 2. 右键点击“添加服务引用”。 3. 输入Web Service的URL。 4. 点击“确定”完成引用添加。 添加完成后,项目中会自动生成一个服务代理类,例如`CallWebService.TestWebSoapClient`。你可以通过实例化这个类并调用其方法来调用Web Service。以下是一个示例代码: ```csharp private void btn_Static_Click(object sender, EventArgs e) { // 实例化服务代理类 CallWebService.TestWebSoapClient client = new CallWebService.TestWebSoapClient(); // 调用无参方法 string value1 = client.HelloWorld(); // 调用有参方法 string value2 = client.Test("有参方法"); // 显示结果 MessageBox.Show($"无参方法返回值:{value1},有参方法返回值:{value2}"); } ``` 运行程序,点击按钮,即可看到Web Service方法的调用结果。 二、动态调用 静态引用虽然方便,但当Web Service的地址变更时,需要重新添加引用。为了解决这个问题,可以使用`System.ServiceModel`命名空间中的类动态创建服务代理。这种方式更灵活,但需要手动处理类型转换和错误处理。 动态调用的基本步骤如下: 1. 创建`System.ServiceModel.ChannelFactory`对象,指定Web Service的协定和服务终结点。 2. 使用`CreateChannel`方法创建服务代理实例。 3. 通过代理实例调用Web Service方法。 4. 不要忘记关闭通道和工厂,释放资源。 以下是一个动态调用的示例代码片段: ```csharp using System.ServiceModel; // 定义服务接口 [ServiceContract(Namespace = "http://yourwebservicenamespace.com")] public interface ITestWebService { [OperationContract] string HelloWorld(); [OperationContract] string Test(string input); } private void btn_Dynamic_Click(object sender, EventArgs e) { // 创建终结点地址 EndpointAddress address = new EndpointAddress("http://yourwebserviceurl.com/Service.asmx"); // 创建绑定,这里以BasicHttpBinding为例 BasicHttpBinding binding = new BasicHttpBinding(); // 创建ChannelFactory并指定服务接口和绑定 ChannelFactory<ITestWebService> factory = new ChannelFactory<ITestWebService>(binding, address); try { // 创建服务代理 ITestWebService proxy = factory.CreateChannel(); // 调用方法 string value1 = proxy.HelloWorld(); string value2 = proxy.Test("有参方法"); // 显示结果 MessageBox.Show($"无参方法返回值:{value1},有参方法返回值:{value2}"); // 关闭通道和工厂 ((IClientChannel)proxy).Close(); factory.Close(); } catch (Exception ex) { // 错误处理 MessageBox.Show($"调用出错:{ex.Message}"); ((ICommunicationObject)proxy).Abort(); factory.Abort(); } } ``` 总结,C#调用Web Service提供了静态引用和动态创建服务代理两种方式。静态引用适合于Web Service地址稳定的情况,而动态调用则更适合于地址可能变化的场景。理解这两种方法可以帮助开发者更好地应对不同情况下的Web Service调用需求。