一、WebService的调试
net 2.0新建webservice为了安全考虑,默认关闭了Post和Get方法 。
让其打开,可在Web.config文件的<system.web>下增加(如果已经存在就修改之)
<webServices> <protocols> <add name="HttpGet"/> <!--或<add name="HttpPost"/>--> </protocols> </webServices>
Web服务定义如下:
[WebMethod] public int Add(int i) { return 33+i; }
通过URL访问Web服务,HttpGet方式返回XML:
http://../WebServices1.asmx/Add?i=1
返回:
<?xml version="1.0"?> <int xmlsns="..">34</int>
二、WebMethod属性:
WebMethod有6个属性:
- .Description:是对webservice方法描述的信息。就像webservice方法的功能注释,可以让调用者看见的注释。
- .EnableSession:指示webservice否启动session标志,主要通过cookie完成的,默认false。
- .MessageName:主要实现方法重载后的重命名。
- .TransactionOption:指示 XML Web services 方法的事务支持。
- .CacheDuration:Web支持输出高速缓存,这样webservice就不需要执行多遍,可以提高访问效率,
- .BufferResponse:配置WebService方法是否等到响应被完全缓冲完,才发送信息给请求端。普通应用要等完全被缓冲完才被发送的!
三、EnableSession属性
指示webservice否启动session标志,主要通过cookie完成的。默认为false。
[WebMethod(true)] //默认参数为EnableSession public string Login(string name) { Context.Session["name"] = name; return name; }
[WebMethod(EnableSession = true)] public string GetName() { if (Context.Session["name"] != null) return Context.Session["name"].ToString(); else return ""; }
在客户端,要在实例化了webservice代理类之后,要为它的CookieContainer 实例化一个 new CookieContainer(),这样才能使用session存储状态多个页面使用。
新类继承引用的webservice,并给CookieContainer赋值。
public class WebService1:localhost.WebService { private static System.Net.CookieContainer cookieContainer; static WebService1() { cookieContainer = new System.Net.CookieContainer();//静态初始化 } public WebService1() { this.CookieContainer = cookieContainer; } }
在各个页面使用派生的WebService类,可以获得同一个CookieContainer :
protected void btnLogin_Click(object sender, EventArgs e) { WebService1 ws = new WebService1(); ws.Login(txtName.Text); }
protected void btnGetName_Click(object sender, EventArgs e) { WebService1 ws = new WebService1(); lblName.Text = ws.GetName(); }
四、MessageName属性
主要实现方法重载后的重命名,在Soap消息中引用时,SOAP使用MessageName而非方法名。
在下面的示例中,MessageName 用于消除两个 Add 方法的歧义。
通过Add访问的是第一个方法,而通过Add2访问的是第二个方法!
public class Calculator : WebService { // The MessageName property defaults to Add for this XML Web service method. [WebMethod] public int Add(int i, int j) { return i + j; }
[WebMethod(MessageName="Add2")] public int Add(int i, int j, int k) { return i + j + k; } }
五、WebService基于SOAPHeadear实现安全认证
1、首先自定义SoapHeader,需继承自System.Web.Services.Protocols.SoapHeader
/// <summary> ///自定义的SoapHeader /// </summary> public class MySoapHeader : System.Web.Services.Protocols.SoapHeader { public MySoapHeader() { } public MySoapHeader(string userName, string passWord) { this.UserName = userName; this.PassWord = passWord; } public string UserName {set;get;} public string PassWord { set; get; } }
2、添加WebService:
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class WebService : System.Web.Services.WebService { //声明Soap头实例 public MySoapHeader myHeader = new MySoapHeader(); [System.Web.Services.Protocols.SoapHeader("myHeader")] [WebMethod] [SoapHeader(myHeader)]//用户身份验证的SOAP头 public string HelloWord() { //可以通过存储在数据库中的用户与密码来验证 if (myHeader.UserName.Equals("SoapHeader") & myHeader.PassWord.Equals("456789")) { return "调用服务成功!"; } else { return "对不起,您没有权限调用此服务!"; } } }
3、客户端调用,设置SoapHeader;
localhost.WebService service = new localhost.WebService(); //将用户名与密码存入SoapHeader; localhost.MySoapHeader header = new localhost.MySoapHeader(); header.UserName = "SoapHeader"; header.PassWord = "456789"; service.MySoapHeaderValue = header; Console.WriteLine("设置SoapHeader:" + service.HelloWord()); //或者 Console.WriteLine("设置SoapHeader:" + service.HelloWord(header));