國慶長假到了,本想出去玩玩,無奈自己屌絲一枚,啥都沒有,只能自己宅在家里思考思考人生。不過人生還是過于復雜,一時間也想不出個所以然,只能是整理一下在工作中遇到的一些小問題,首先是關于帶soapheader的webservice。
一、webservice大家都用的比較頻繁,有時也有一些帶soapheader的webservice,首先一種最簡單的調用soapheader的情況就是,如果對方的webservice也是用.net寫的,可能會是這種方式
[WebMethod] [SoapHeader("Header")] public string HelloWorld() { if (Header.username == "admin" && Header.passWord == "123") { return "Hello World"; } else { throw new Exception("驗證失敗"); } } public class AuthHeader : SoapHeader { public string username; public string password; }
之后我們在通過添加服務引用或者是利用vs的wsdl工具生成代理類,都會把上面的AuthHeader類型給生成好,我們要做的就是簡單的賦值工作了
public void PRocessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; //要調用的webservice的類型,自動生成在代理類中 SoapHeaderTest soapTest = new SoapHeaderTest(); //要調用的soapheader的類型,自動生成在代理類中 AuthHeader authHeader = new AuthHeader(); authHeader.username = "admin"; authHeader.password = "123"; soapTest.AuthHeaderValue = authHeader; string content = soapTest.HelloWorld(); context.Response.Write(content); }
通過這種方式就可以通過驗證調用webservice獲取返回信息了。
二、有些時候我們發現我們調用對方的webservice一直失敗,然后添加的服務引用或者是代理類中也沒有soapheader的類型,然后客戶告訴我們,你要調用接口必須傳soapHeader,這個soapHeader在.net中是這樣的
[DataContract(Namespace = "http://xxx.xxx.xxxxx")] public class AuthHeader { public string username { get; set; } public string password { get; set; } }
我們把這個AuthHeader按照上面的格式寫好。然后在調用webservice中的方法之前加上我們的soapheader,代碼如下:
//添加服務引用生成的類型 SoapTestService.SoapHeaderTestSoapClient client = new SoapTestService.SoapHeaderTestSoapClient(); //客戶告訴我們AuthHeader的類型,然后自己在程序中對應寫出來 AuthHeader header = new AuthHeader(); header.username = "admin"; header.password = "123"; //開始加入監控頭信息 AddressHeader soapheader = AddressHeader.CreateAddressHeader("AuthHeader", // Header Name "http:xxx.xxx.xxxxx",//地址頭的命名空間 header);//傳人的AuthHeader EndpointAddressBuilder eab = new EndpointAddressBuilder(client.Endpoint.Address); eab.Headers.Add(soapheader);//將地址頭加入進去 client.Endpoint.Address = eab.ToEndpointAddress(); //結束加入監控頭信息
之后在調用webservice的方法就可以成功調用并獲取返回內容了。
三、最后一種情況就是人家只告訴你需要加一個這樣的
<AuthHeader>
<username>用戶名</username>
<password>密碼</password>
</AuthHeader>
這個時候就需要使用我們的SoapUI了,我們來用soapui看看我們報文吧
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/"> <soap:Header/> <soap:Body> <tem:HelloWorld/> </soap:Body></soap:Envelope>
發現怎么<soap:Header/>中是空的呢,然后我們按照別人給的格式將soapheader中填上
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/"> <soap:Header> <AuthHeader> <username>admin</username> <password>123</password> </AuthHeader> </soap:Header> <soap:Body> <tem:HelloWorld/> </soap:Body></soap:Envelope>
然后這樣發送過去,發現webservice成功訪問并且接收到返回值了,哎,任務時間比較緊迫,只能用最簡單也是最笨的方法了,替換數據然后在把報文發過去
string url = ConfigurationManager.AppSettings["ContractWebService"].ToString(); //通過webservice的地址創建HttpWebRequest var webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url)); webRequest.Accept = "text/xml"; webRequest.Method = "POST";//請求方式,必須寫 //將請求報文寫進去 using (var requestStream = webRequest.GetRequestStream()) { using (var textWriter = new StreamWriter(requestStream)) { textWriter.Write(SoapXml);//這里的soapxml就是我們要發送報文的字符串 } } //發出請求并且獲取響應信息 WebResponse wr = webRequest.GetResponse(); string retString = ""; //將返回的xml格式的報文取出 using (Stream myResponseStream = wr.GetResponseStream()) { using (StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("UTF-8"))) { retString = myStreamReader.ReadToEnd(); } }
最終返回的xml中的內容也只能是自己解析了。。。
可能遇到后面兩種情況的會少一些,希望大家有其他的方式可以分享一下。最后祝大家國慶節快樂!
新聞熱點
疑難解答