zoukankan      html  css  js  c++  java
  • 在ASP.NET Core调用WebService

    一、前言

    现实生产中,有一些比较老的系统对外提供的接口都是WebService形式的,如果是使用.NET Framework创建的项目调用WebService非常方便,网上有很多代码示例,这里不在讲解,下面我们讲解如何在ASP.NET Core项目里面调用WebService。首先我们需要创建一个WebService项目和一个ASP.NET Core WebApi项目。创建的WebService代码如下:

    using System.Web.Services;
    
    namespace CoreCallWebServiceTest
    {
        /// <summary>
        /// CoreTest 的摘要说明
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 
        // [System.Web.Script.Services.ScriptService]
        public class CoreTest : System.Web.Services.WebService
        {
    
            [WebMethod]
            public string HelloWorld()
            {
                return "Hello World";
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="para"></param>
            /// <returns></returns>
            [WebMethod]
            public string TestMethod(string para)
            {
                return $"输入参数:{para}";
            }
        }
    }

    里面分别有一个无参和有参的方法。我们在ASP.NET Core WebApi项目里面分别调用这两个方法并输出。

    二、引用WebService

    首先我们在创建好的ASP.NET Core WebApi项目里面添加WebService的引用。

    1、在依赖项上面右键,选择“添加连接的服务”,如图所示:

     2、选择“Microsoft WCF Web Service Referenct Provider”,如图所示:

     3、添加服务引用。如图所示:

    配置完以后,点击“下一步”,去掉重新使用引用的程序集中的类型签名的复选框。如果不去掉复选框,生成的时候可能会报错。

    直接点击“完成”按钮即可。慢慢等待配置完成:

    配置完成界面如图所示:

    这样就添加完了,下面开始在代码里面调用提供的WebService里面的方法。

    三、在代码中调用WebService

    我们添加一个名为Test的控制器,里面有一个Get方法,返回WebService里面两个方法的返回值,代码如下:

    using System.ServiceModel;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using TestWebService;
    
    namespace AspNetCoreDemo.Controllers
    {
        [Route("api/Test")]
        [ApiController]
        public class TestController : ControllerBase
        {
            [HttpGet]
            public string Get()
            {
                //创建 HTTP 绑定对象
                var binding = new BasicHttpBinding();
                //根据 WebService 的 URL 构建终端点对象,参数是提供的WebService地址
                var endpoint = new EndpointAddress(@"http://localhost:37907/CoreTest.asmx");
                //创建调用接口的工厂,注意这里泛型只能传入接口 泛型接口里面的参数是WebService里面定义的类名+Soap
                var factory = new ChannelFactory<CoreTestSoap>(binding, endpoint);
                //从工厂获取具体的调用实例
                var callClient = factory.CreateChannel();
                //调用具体的方法,这里是 HelloWorldAsync 方法
                Task<HelloWorldResponse> responseTask = callClient.HelloWorldAsync(new HelloWorldRequest());
                //获取结果
                HelloWorldResponse response = responseTask.Result;
                // 获取HelloWorld方法的返回值
                string result1 = response.Body.HelloWorldResult;
    
                // 调用TestMethod方法,不传递参数
                Task<TestMethodResponse> testResponse = callClient.TestMethodAsync(new TestMethodRequest());
                // 获取
                string result2 = testResponse.Result.Body.TestMethodResult;
    
                // 调用TestMethod方法,并传递参数
                TestMethodRequestBody body = new TestMethodRequestBody("测试TestMethod方法");
                Task<TestMethodResponse> testResponsePara = callClient.TestMethodAsync(new TestMethodRequest(body));
                // 获取
                string result3 = testResponse.Result.Body.TestMethodResult;
    
                return $"HelloWorld方法返回值:{result1},TestMethod方法不传递参数返回值:{result2},TestMethod方法传递参数的返回值:{result3}";
            }
        }
    }

    我们在WebService里面定义的TestMethod方法有一个string类型的参数,调用的时候有两个重载函数,一个无参,一个有参,看一下自动生成的Reference.cs类里面的代码:

    发现TestMethodRequestBody有两个构造函数:一个无参,一个有参。我们在浏览器里面调用Get方法,程序输出结果:

    除了上面的代码,也可以使用下面的代码进行调用:

    using System.ServiceModel;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Mvc;
    using TestWebService;
    
    namespace AspNetCoreDemo.Controllers
    {
        [Route("api/Test")]
        [ApiController]
        public class TestController : ControllerBase
        {
            [HttpGet]
            public string Get()
            {
                #region 调用方法1
                ////创建 HTTP 绑定对象
                //var binding = new BasicHttpBinding();
                ////根据 WebService 的 URL 构建终端点对象,参数是提供的WebService地址
                //var endpoint = new EndpointAddress(@"http://localhost:37907/CoreTest.asmx");
                ////创建调用接口的工厂,注意这里泛型只能传入接口 泛型接口里面的参数是WebService里面定义的类名+Soap
                //var factory = new ChannelFactory<CoreTestSoap>(binding, endpoint);
                ////从工厂获取具体的调用实例
                //var callClient = factory.CreateChannel();
                ////调用具体的方法,这里是 HelloWorldAsync 方法
                //Task<HelloWorldResponse> responseTask = callClient.HelloWorldAsync(new HelloWorldRequest());
                ////获取结果
                //HelloWorldResponse response = responseTask.Result;
                //// 获取HelloWorld方法的返回值
                //string result1 = response.Body.HelloWorldResult;
    
                //// 调用TestMethod方法,不传递参数
                //Task<TestMethodResponse> testResponse = callClient.TestMethodAsync(new TestMethodRequest());
                //// 获取
                //string result2 = testResponse.Result.Body.TestMethodResult;
    
                //// 调用TestMethod方法,并传递参数
                //TestMethodRequestBody body = new TestMethodRequestBody("测试TestMethod方法");
                //Task<TestMethodResponse> testResponsePara = callClient.TestMethodAsync(new TestMethodRequest(body));
                //// 获取
                //string result3 = testResponsePara.Result.Body.TestMethodResult; 
                #endregion
    
    
                #region 调用方法2
                BasicHttpBinding binding = new BasicHttpBinding();
    
                EndpointAddress address = new EndpointAddress("http://localhost:37907/CoreTest.asmx");
    
                CoreTestSoapClient client = new CoreTestSoapClient(binding, address);
    
                Task<HelloWorldResponse> responseTask = client.HelloWorldAsync();
                HelloWorldResponse response = responseTask.Result;
                // 获取HelloWorld方法的返回值
                string result1 = response.Body.HelloWorldResult;
    
                // 调用TestMethod方法,这时必须传入参数
                Task<TestMethodResponse> testResponseTask = client.TestMethodAsync("测试TestMethod方法");
                // 获取TestMethod方法的返回值
                string result2 = testResponseTask.Result.Body.TestMethodResult;
                #endregion
                return $"HelloWorld方法返回值:{result1},TestMethod方法返回值:{result2}";
            }
        }
    }

    在这种方式中,调用有参的方法必须要传递参数。

    程序运行结果:

    如果以后WebService有更新,只需要更新添加的服务引用即可,如图所示:

  • 相关阅读:
    python——集合
    python——字典
    python——用递归的方法求x的y次幂
    python——全局变量&局部变量
    python——组织列表
    Linux显示网络相关信息
    Linux里的发消息
    Linux中各种压缩文件
    Linux中的man
    Linux的find命令
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/12327310.html
Copyright © 2011-2022 走看看