.Net之SoapCore簡單使用
最近在工作中,需要同時放出來WebAPI接口和支持Soap協(xié)議的WebService接口,在dotNetFramework時候玩過WebService,這可是好久沒再碰過了,沒想到現(xiàn)在居然遇到了。只好迎難而上。
介紹
本來是在ASP.NetCore中使用了組件SoapCore來使用Soap協(xié)議。
支持以下框架:
- .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)
官網(wǎng):https://github.com/DigDes/SoapCore
操作
準備工作
為了省事,我還在之前的文章demo上面操作,地址是:https://gitee.com/AZRNG/my-example ,分支是:inmemory_soap ,當前項目已經(jīng)包含一些WebAPI接口,我要實現(xiàn)使用Soap協(xié)議也放出這些接口,共用UserService類。
開始編寫接口
環(huán)境: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中配置終結(jié)點路由
- 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項目
選中項目右鍵=>添加=>服務(wù)引用=>WCF Web Service
輸入url,點擊go出來服務(wù)
下一步
最后一直下一步直到完成
這個時候vs已經(jīng)幫我們生成了調(diào)用的方法,后期地址有變動可以直接去修改這個代碼。
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();
通過先調(diào)用添加接口然后調(diào)用查詢接口可以查詢到我們剛才添加到的數(shù)據(jù)。
控制臺程序
向上面一樣將Soap服務(wù)引用到項目中
事例一:直接構(gòu)建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();
事例二:
- // 創(chuàng)建 HTTP 綁定對象
- var binding = new BasicHttpBinding();
- // 根據(jù) WebService 的 URL 構(gòu)建終端點對象
- var endpoint = new EndpointAddress(@"http://localhost:5000/UserContractImpl.asmx");
- // 創(chuàng)建調(diào)用接口的工廠,注意這里泛型只能傳入接口
- var factory = new ChannelFactory<UserContractImplChannel>(binding, endpoint);
- // 從工廠獲取具體的調(diào)用實例
- var callClient = factory.CreateChannel();
- // 調(diào)用具體的方法,這里是 GetListAsync 方法。
- var result = await callClient.GetListAsync();
參考文檔
https://github.com/DigDes/SoapCore