如何在Asp.NET Core中调用WebService的方法?

在Asp.NET Core中调用WebService的方法,可以通过多种方式实现,下面将详细介绍如何在ASP.NET Core项目中调用WebService的方法。

如何在Asp.NET Core中调用WebService的方法?

一、前言

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

二、引用WebService

1、添加服务引用:在ASP.NET Core WebApi项目中右键点击“依赖项”,选择“添加连接的服务”。

2、选择WCF Web Service Referenct Provider:在弹出的窗口中选择“Microsoft WCF Web Service Referenct Provider”。

3、配置服务引用:输入WebService的URL并点击下一步,去掉重新使用引用的程序集中的类型签名的复选框,如果不去掉复选框,生成的时候可能会报错,直接点击“完成”按钮即可,等待配置完成后,会在项目中添加相应的服务引用。

三、在代码中调用WebService

1. 添加控制器

我们添加一个名为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(body);
            // 获取
            string result3 = testResponsePara.Result.Body.TestMethodResult;
            return $"HelloWorld方法返回值: {result1}, TestMethod方法返回值: {result2}, TestMethod带参数方法返回值: {result3}";
        }
    }
}

2. 配置服务***扩展

在Startup.cs文件中注册WebService服务:

如何在Asp.NET Core中调用WebService的方法?

public static class WebServiceCollectionExtensions
{
    public static void ConfigureWebServices(this IServiceCollection services)
    {
        services.AddSingleton<ASoap>(new ASoapClient(ASoapClient.EndpointConfiguration.ASoapSoap));
    }
}

3. 调用服务方法

在控制器中使用注入的WebService客户端调用远程方法:

using Microsoft.Extensions.DependencyInjection;
using Demo.Services;
using Microsoft.AspNetCore.Mvc;
namespace Demo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class WebServiceController : ControllerBase
    {
        private readonly ASoap _aSoap;
        public WebServiceController(IServiceProvider serviceProvider)
        {
            _aSoap = serviceProvider.GetService<ASoap>();
        }
        [HttpGet]
        public async Task<IActionResult> UpdateAppointment()
        {
            await _aSoap.UpdateAppointmentAsync();
            return Ok();
        }
    }
}

通过上述步骤,我们可以在ASP.NET Core项目中成功调用WebService的方法,以下是一些需要注意的地方:

确保WebService的URL正确且可访问。

在调用异步方法时,注意处理异步操作的结果。

如果遇到类型签名问题,可以尝试去掉重新使用引用的程序集中的类型签名的复选框。

在生产环境中,建议使用HttpClient来代替静态引用的方式调用WebService。

相关问题与解答

Q1: 如何在ASP.NET Core中通过HttpClient调用WebService?

如何在Asp.NET Core中调用WebService的方法?

A1: 可以通过以下步骤使用HttpClient调用WebService:

1、在ASP.NET Core WebApi项目中安装HttpClient包。

2、在Startup.cs文件中配置HttpClient服务。

3、在控制器中使用HttpClient发送请求并接收响应。

Q2: 如何处理WebService调用中的异常?

A2: 在调用WebService时,可以使用try-catch块来捕获和处理异常。

try
{
    // 调用WebService方法
}
catch (Exception ex)
{
    // 处理异常,记录日志或返回错误信息
}

小伙伴们,上文介绍了“Asp.NET Core 如何调用WebService的方法”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。