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

访问:http://../WebServices1.asmx/Add2?i=1

五、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));