使用SoapCore實現在.net core平臺下開發webservice;以及使用HttpClientFactory動態訪問webservice。
首先,需要在包專案下面引用SoapCore:
然後新建專案Wsk.Core.WebService,用於開發webservice有關功能。
新專案下,需要先引用package專案,然後新建一個IWeskyWS介面,以及提供了三個Hello方法(webservice有可能不支援過載,如果後面無法進行服務引用,可以更改為Hello1,Hello2,Hello3),用於實驗使用。其他介紹,如下圖示註所示:
該部分程式碼:
[ServiceContract] public interface IWeskyWS { [OperationContract] string Hello1(); [OperationContract] string Hello2(string name); [OperationContract] string Hello3(NameInfo info); } public class WeskyWS : IWeskyWS { public string Hello1() { return "Hello"; } public string Hello2(string name) { return $"Hello, {name}"; } public string Hello3(NameInfo info) { return $"Hello,{info.Name}, Age is {info.Age}"; } } [DataContract] public class NameInfo { [DataMember] public int Age { get; set; } [DataMember] public string Name { get; set; } }
現在轉到啟動專案下,引用該專案。然後在啟動項裡面,新增服務注入:
在Configure下,新增UseSoapEndpoint,以及有關注釋,如圖註釋部分:
啟動程式,並且在瀏覽器下指定對應的asmx地址,如果有提示下方的xml文件,則代表啟動成功。
現在我們們新建一個基於.net framework的控制檯專案,用來做測試使用。
建立完畢以後,結構如下:
現在通過引用服務的方式進行引用一下:
在Main方法下面呼叫webservice,並列印,結果如下:
注意有個坑:使用SoapCore開發的該Webservice,目前只能通過新增服務引用的方式被識別。使用動態訪問方式,會無法訪問。如果其他小夥伴解決了該問題,歡迎留言。
接下來提供一個簡單的使用.net core通過HttpClientFactory來訪問Webservice的方法。
注意還有一個坑:該方法目前僅針對於webservice方法引數不存在實體類的情況下。如果是複雜資料,目前暫時不支援,或者是我當前未找到行之有效的方法,也歡迎各位大佬留言評論,提供更加有效的法子。
由於上面使用soapCore開發的webservice目前只能被服務引用,所以此處不對其做動態訪問測試有興趣的可以自行嘗試。我先建立一個使用.net framework開發的webservice。
新建一個Asp.Net Web應用程式,配置如下圖:
建立以後,新增一個新建項,選擇web服務,用以開發webservice測試方法:
建立成功,以後,結構如下圖,以及會有一個預設的HelloWorld方法。
現在加點測試方法,帶一個引數的Hello1,以及帶兩個引數的Hello2:
執行以後,如果有以下頁面,說明該webservice開發成功:
現在切換回Wsk.Core專案,在啟動專案的控制器裡面,新建一個webapi,,用來觸發訪問webservice的方法,進行有關驗證。先新增HttpClientFactory的依賴注入:
在此之前,還需要在啟動項裡面,新增對HttpClient的註冊:
現在在新增的webapi裡面,做一些訪問webservice的實現。先新建一個動態訪問webservice的方法:
方法程式碼:
private String CallWebservice(string url, Dictionary<string, string> dictionary) { HttpContent content; if (dictionary != null) { content = new FormUrlEncodedContent(dictionary); } else { content = new StringContent(""); } string result = string.Empty; try { using (HttpClient client = _httpClientFactory.CreateClient()) { using (var response = client.PostAsync(url,content).Result) { if(response.StatusCode == System.Net.HttpStatusCode.OK) { result = response.Content.ReadAsStringAsync().Result; //XmlDocument xml = new XmlDocument(); //xml.LoadXml(result); //result = xml.InnerText; } } } } catch(Exception ex) { result = $"Error:{ex.Message}"; } return result; }
其中,註釋部分是用於獲取xml內資料使用的,為了看完整的資料,所以做了註釋。有興趣的可以開啟註釋進行嘗試。
然後在TestCallWS這個api下面對以上三個webservice方法進行訪問:
該webapi程式碼:
[HttpPost] public IActionResult TestCallWS() { string url = "http://localhost:8435/WeskyService.asmx/"; string method = "HelloWorld"; string wsUrl = $"{url}{method}"; string value1 = CallWebservice(wsUrl, null); Dictionary<string, string> dic = new Dictionary<string, string>(); method = "Hello1"; wsUrl = $"{url}{method}"; dic.Add("name", "Wesky"); string value2 = CallWebservice(wsUrl, dic); dic = new Dictionary<string, string>(); method = "Hello2"; wsUrl = $"{url}{method}"; dic.Add("age", "3"); dic.Add("name", "WESKY"); string value3 = CallWebservice(wsUrl, dic); return Ok($"{value1}\n{value2}\n{value3}"); }
啟動程式,並且在swagger上面進行呼叫,看看結果:
訪問成功,教程結束。
以上寫法也不是最好的寫法,以及使用.net core開發webservice如何能夠被動態訪問、以及在.net core上如何動態訪問帶實體引數的方法,目前還需要進一步探討。也歡迎大佬們踴躍提供可行的技術方向。感謝大家抽時間看完該文章,希望對大家能有一點幫助。
先前也有一期使用HttpClient和HttpWebRequest進行訪問webapi的文章,如果有興趣也可以蒞臨指導:https://www.cnblogs.com/weskynet/p/14856130.html
到此完畢,謝謝觀看。