.Net之SoapCore簡單使用
最近在工作中,需要同時放出來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();
參考文檔
https://github.com/DigDes/SoapCore