在ASP.NET Core调用WebService
阅读原文时间:2023年07月10日阅读:1

一、前言

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

using System.Web.Services;

namespace CoreCallWebServiceTest
{
///

/// CoreTest 的摘要说明 ///
[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(binding, endpoint);
//从工厂获取具体的调用实例
var callClient = factory.CreateChannel();
//调用具体的方法,这里是 HelloWorldAsync 方法
Task 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(binding, endpoint);
////从工厂获取具体的调用实例
//var callClient = factory.CreateChannel();
////调用具体的方法,这里是 HelloWorldAsync 方法
//Task 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有更新,只需要更新添加的服务引用即可,如图所示:

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器