十九、.net core使用SoapCore開發webservice介面,以及使用HttpClientFactory動態訪問webservice介面

 

使用SoapCore實現在.net core平台下開發webservice;以及使用HttpClientFactory動態訪問webservice

首先,需要在包項目下面引用SoapCore

 

 

 

然後新建項目Wsk.Core.WebService,用於開發webservice有關功能。

新項目下,需要先引用package項目,然後新建一個IWeskyWS介面,以及提供了三個Hello方法(webservice有可能不支援重載,如果後面無法進行服務引用,可以更改為Hello1Hello2Hello3),用於實驗使用。其他介紹,如下圖標註所示:

 

 

該部分程式碼:

[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; }
    }

View Code

 

現在轉到啟動項目下,引用該項目。然後在啟動項裡面,添加服務注入:

 

 

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;
        }

View Code

其中,注釋部分是用於獲取xml內數據使用的,為了看完整的數據,所以做了注釋。有興趣的可以打開注釋進行嘗試。

 

然後在TestCallWS這個api下面對以上三個webservice方法進行訪問:

 

 

該webapi程式碼:

 [HttpPost]
        public IActionResult TestCallWS()
        {

            string url = "//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}");
        }

View Code

 

 

啟動程式,並且在swagger上面進行調用,看看結果:

 

 

訪問成功,教程結束。

 

以上寫法也不是最好的寫法,以及使用.net core開發webservice如何能夠被動態訪問、以及在.net core上如何動態訪問帶實體參數的方法,目前還需要進一步探討。也歡迎大佬們踴躍提供可行的技術方向。感謝大家抽時間看完該文章,希望對大家能有一點幫助。

先前也有一期使用HttpClientHttpWebRequest進行訪問webapi的文章,如果有興趣也可以蒞臨指導://www.cnblogs.com/weskynet/p/14856130.html

 

到此完畢,謝謝觀看。