C#調用WebService(Soap)接口

首先了解兩點知識,1.什麼時webserve,2.什麼是soap

1.WebService是一個SOA(面向服務的編程)的架構,它是不依賴於語言,不依賴於平臺,可以實現不同的語言間的相互調用,通過Internet進行基於Http協議的網絡應用間的交互。 WebService實現不同語言間的調用,是依託於一個標準,webservice是需要遵守WSDL(web服務定義語言)/SOAP(簡單請求協議)規範的。 WebService=WSDL+SOAP+UDDI(webservice的註冊)。WebServices 提供一個建立分佈式應用的平臺。

2.SOAP 是基於 XML 的簡易協議,可使應用程序在 HTTP 之上進行信息交換。或者更簡單地說:SOAP 是用於訪問網絡服務的協議,基於 XML。SOAP 是一種用於發送消息的格式。

第一步:調通接口

在對接之前保證接口的是能調通的,我使用了PostMan和SoapUI進行調試。SoapUI是可以調通的,PostMan一開始調不通報了500的錯誤,後來發先是Headers沒有寫SoapAction。SoapAction的值在SoapUI中可以看到。

第二步發送請求

現在知道有兩種方法,第一種直接封裝信封,使用WebRequest。代碼如下:

public static string GetWebSock()
        {
            StringBuilder soap = new StringBuilder();
            soap.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
            soap.Append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:jet=\"http://jjj\" xmlns:jet1=\"http://jjj1/2004/07/jjj.DataModel.Cis\" xmlns:jet2=\"http://jjj2/2004/07/jjj.DataModel.DXS\">");
            soap.Append("<soapenv:Header/>");
            soap.Append("<soapenv:Body>");
            soap.Append("<jet:QueryEncounter>");
            soap.Append("<jet:param>");
            soap.Append("<jet1:Provider></jet1:Provider>");
            soap.Append("<jet2:AdmitDateOn>2019-12-30</jet2:AdmitDateOn>");
            soap.Append("<jet2:EncounterKindCode>0</jet2:EncounterKindCode>");
            soap.Append("<jet2:IPSeqNoText>79</jet2:IPSeqNoText>");
            soap.Append("</jet:param>");
            soap.Append("</jet:QueryEncounter>");
            soap.Append("</soapenv:Body>");
            soap.Append("</soapenv:Envelope>");

            //發起請求
            Uri uri = new Uri("http://xxx/ESBService/Query.svc");
            string a = "";
            try
            {
                WebRequest webRequest = WebRequest.Create(uri);
                webRequest.ContentType = "text/xml; charset=UTF-8";
                webRequest.Method = "POST";
                webRequest.Headers.Add("SOAPAction", "http://jjj/IQuerySvc/QueryEncounter");
                using (Stream requestStream = webRequest.GetRequestStream())
                {
                    byte[] paramBytes = Encoding.UTF8.GetBytes(soap.ToString());
                    requestStream.Write(paramBytes, 0, paramBytes.Length);
                }

                //響應
                WebResponse webResponse = webRequest.GetResponse();
                using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
                {
                    //Console.WriteLine(myStreamReader.ReadToEnd());
                    a += myStreamReader.ReadToEnd();
                }
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(a);
                //解析方法
                XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
                //此處是soap1.1如下:
                mgr.AddNamespace("s", "http://jjjj/soap/envelope/");
                mgr.AddNamespace("a", "http://jjjj/2004/07/JetSun.DataModel.DXS");
                mgr.AddNamespace("i", "http://jjjj/2001/XMLSchema-instance");
                mgr.AddNamespace("z", "http://jjjj/2003/10/Serialization/");

                var rootNode = doc.SelectNodes("//a:QueryEncounter_Result/*", mgr);
                string name = "";
                foreach (XmlNode xxNode in rootNode)
                {
                    string dsf = xxNode.InnerText;
                    string sdf = xxNode.Name;
                    //name += "|節點名字:" + sdf + "|節點文本:" + dsf + "|節點本地名字" + xxNode.Value;
                        name += sdf + ":" + dsf;
                }
                a = name + "---------------------------" + a;
                //解析XML
            }
            catch (Exception err)
            {
                return err.ToString();
            }
            return a;

        }

soap1.1需要使用post請求需要注意的有兩個地方:

1.請求頭需要加soapAction(代碼已在上個模塊,這裏只是再次列出)

webRequest.Headers.Add("SOAPAction", "http://jjj/IQuerySvc/QueryEncounter");

2.解析時需要根據返回的參數增加命名控件(代碼已在上個模塊,這裏只是再次列出)

比如返回的xml信息是這樣的

//返回的xml頭信息
<s:Envelope xmlns:s=\"http://jjjj/soap/envelope/\">
<s:Body>
<QueryEncounterResponse xmlns=\"http://jjjj\">
<QueryEncounterResult xmlns:a=\"http://jjjj/2004/07/JetSun.DataModel.DXS\" xmlns:i=\"http://jjjj/2001/XMLSchema-instance\">
<a:QueryEncounter_Result z:Id=\"i1\" xmlns:z=\"http://jjjj/2003/10/Serialization/\">



     //解析方法  那些標籤可以看出命名控件名有s,a,i,z,對應上相應的地址就可以了
     XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
     //此處是soap1.1如下:
      mgr.AddNamespace("s", "http://jjjj/soap/envelope/");
      mgr.AddNamespace("a", "http://jjjj/2004/07/JetSun.DataModel.DXS");
      mgr.AddNamespace("i", "http://jjjj/2001/XMLSchema-instance");
      mgr.AddNamespace("z", "http://jjjj/2003/10/Serialization/");

 

另外一種使用別的插件 以後再補上

發佈了23 篇原創文章 · 獲贊 7 · 訪問量 7908
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章