.Net之SoapCore简单使用

发表于:2021-9-23 09:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:AZRNG    来源:鹏祥

  最近在工作中,需要同时放出来WebAPI接口和支持Soap协议的WebService接口,在dotNetFramework时候玩过WebService,这可是好久没再碰过了,没想到现在居然遇到了。只好迎难而上。
  介绍
  本来是在ASP.NetCore中使用了组件SoapCore来使用Soap协议。
  支持以下框架:
  .NET 5.0(使用 ASP.NET Core 5.0)
  .NET Core 3.1(使用 ASP.NET Core 3.1)
  .NET Core 2.1(使用 ASP.NET Core 2.1)
  .NET Standard 2.0(使用 ASP.NET Core 2.1)
  官网:https://github.com/DigDes/SoapCore
  操作
  准备工作
  为了省事,我还在之前的文章demo上面操作,地址是:https://gitee.com/AZRNG/my-example ,分支是:inmemory_soap ,当前项目已经包含一些WebAPI接口,我要实现使用Soap协议也放出这些接口,共用UserService类。
  开始编写接口
  环境:dotnet5.0 + SoapCore 1.1.0.10
  安装组件
  <PackageReference Include="SoapCore" Version="1.1.0.10" /> 
  ConfigureServices中注入SoapCore
  services.AddSoapCore(); 
  新建User WebService
  /// <summary> 
  /// User WebService 
  /// </summary> 
  [ServiceContract] 
  public class UserContractImpl 
  { 
      private readonly IUserService _userService; 
      private readonly IMapper _mapper; 
   
      public UserContractImpl(IUserService userService, 
          IMapper mapper) 
      { 
          _userService = userService; 
          _mapper = mapper; 
      } 
   
      /// <summary> 
      /// 查询用户列表 
      /// </summary> 
      /// <returns></returns> 
      [OperationContract] 
      public async Task<List<User>> GetListAsync() 
      { 
          return await _userService.GetListAsync(); 
      } 
   
      /// <summary> 
      /// 查询详情 
      /// </summary> 
      /// <param name="id"></param> 
      /// <returns></returns> 
      [OperationContract] 
      public async Task<User> GetDetailsAsync(string id) 
      { 
          return await _userService.GetDetailsAsync(id); 
      } 
   
      /// <summary> 
      /// 添加 
      /// </summary> 
      /// <param name="dto"></param> 
      /// <returns></returns> 
      [OperationContract] 
      public async Task<string> AddAsync(AddUserVm dto) 
      { 
          return await _userService.AddAsync(dto); 
      } 
   
      /// <summary> 
      /// 删除 
      /// </summary> 
      /// <param name="id"></param> 
      [OperationContract] 
      public async Task<int> DeleteAsync(string id) 
      { 
          return  await _userService.DeleteAsync(id); 
      } 
  } 
  ConfigureServices中注入
  services.AddTransient(); 
  Configure中配置终结点路由
  app.UseEndpoints(endpoints => 
  { 
      endpoints.MapControllers(); 
   
      var binging = new BasicHttpBinding(); 
      binging.ReaderQuotas.MaxStringContentLength = int.MaxValue; 
      endpoints.UseSoapEndpoint<UserContractImpl>("/UserContractImpl.asmx", binging, SoapSerializer.DataContractSerializer); 
  }); 
  访问地址:http://localhost:5000/UserContractImpl.asmx
  WebApi程序客户端
  新建dotnet5.0项目
  选中项目右键=>添加=>服务引用=>WCF Web Service
  输入url,点击go出来服务
  下一步
  最后一直下一步直到完成
  这个时候vs已经帮我们生成了调用的方法,后期地址有变动可以直接去修改这个代码。
  ConfigureServices中注册
  services.AddSingleton<UserContractImpl>(new UserContractImplClient(UserContractImplClient.EndpointConfiguration.BasicHttpBinding)); 
  控制器注入
  private readonly UseService.UserContractImpl _userContractImpl; 
   
  public HomeController( UseService.UserContractImpl userContractImpl) 
  { 
      _userContractImpl = userContractImpl; 
  } 
  使用里面的接口
  var result = await _userContractImpl.AddAsync(new UseService.AddUserVm 
  { 
      Account = "123", 
      PassWord = "456", 
      Sex = UseService.SexEnum.Man 
  }); 
  var list = await _userContractImpl.GetListAsync(); 
  通过先调用添加接口然后调用查询接口可以查询到我们刚才添加到的数据。
  控制台程序
  向上面一样将Soap服务引用到项目中
  事例一:直接构建UserContractImplClient
  var client = new UserContractImplClient(UserContractImplClient.EndpointConfiguration.BasicHttpBinding); 
  var str = await client.AddAsync(new AddUserVm 
  { 
      Account = "23456", 
      PassWord = "456", 
      Sex = SexEnum.Noknow 
  }); 
  var list = client.GetListAsync(); 
  事例二:
  // 创建 HTTP 绑定对象 
  var binding = new BasicHttpBinding(); 
  // 根据 WebService 的 URL 构建终端点对象 
  var endpoint = new EndpointAddress(@"http://localhost:5000/UserContractImpl.asmx"); 
  // 创建调用接口的工厂,注意这里泛型只能传入接口 
  var factory = new ChannelFactory<UserContractImplChannel>(binding, endpoint); 
  // 从工厂获取具体的调用实例 
  var callClient = factory.CreateChannel(); 
  // 调用具体的方法,这里是 GetListAsync 方法。 
  var result = await callClient.GetListAsync(); 

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号