Webservice在請求中加入自定義的SoapHeader,比較常用的場景是在SoapHeader中攜帶用戶登陸信息,由服務端進行身份驗證。今天遇到一個需求,除了在請求時要攜帶SoapHeader外,在返回值中也要返回一個結構不同的SoapHeader對象。簡單點,在參數中增加ref outHeader,也可以實現需求。但是客戶的WebService接口並不是這樣設計的。於是找到下面的處理方法:
定義兩個SoapHeader類:
public class InSoapHeader : SoapHeader { public InSoapHeader() { } public string UserName { get; set; } public string Ip { get; set; } public string Token { get; set; } } public class OutSoapHeader : SoapHeader { public OutSoapHeader() { } public string Ip { get; set; } }
編寫WebService服務:
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class WebService1 : System.Web.Services.WebService { private InSoapHeader _inSoapHeader; public InSoapHeader InSoapHeader { get { return _inSoapHeader; } set { _inSoapHeader = value; } } private OutSoapHeader _outSoapHeader=new OutSoapHeader();//給定初始值,否則在返回時會null public OutSoapHeader OutSoapHeader { get { return _outSoapHeader; } set { _outSoapHeader = value; } } [WebMethod] [SoapHeader("InSoapHeader", Direction = SoapHeaderDirection.In)] [SoapHeader("OutSoapHeader", Direction = SoapHeaderDirection.Out)] public string HelloWorld() { OutSoapHeader.Ip = "123123"; return string.Empty; } }
客戶端調用程序:
private void btnCall_Click(object sender, EventArgs e) { ServiceReference1.WebService1SoapClient cli = new ServiceReference1.WebService1SoapClient(); ServiceReference1.InSoapHeader inheader = new ServiceReference1.InSoapHeader() { Ip="127.0.0.1",Token="N",UserName="N"}; ServiceReference1.OutSoapHeader outheader; string result = string.Empty; outheader=cli.HelloWorld(inheader,out result);//這時候返回值自動放到了參數中,和普通的方法還是有區別的。 System.Diagnostics.Debug.WriteLine(outheader.Ip); //輸出123123 }