• ASP.NET(99):WebService之WebMethod参数介绍


    一、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个属性:

    1. .Description:是对webservice方法描述的信息。就像webservice方法的功能注释,可以让调用者看见的注释。
    2. .EnableSession:指示webservice否启动session标志,主要通过cookie完成的,默认false。
    3. .MessageName:主要实现方法重载后的重命名。
    4. .TransactionOption:指示 XML Web services 方法的事务支持。
    5. .CacheDuration:Web支持输出高速缓存,这样webservice就不需要执行多遍,可以提高访问效率,
    6. .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));
  • 相关阅读:
    hdu 1715
    hdu 1370
    hdu 2370
    hdu 1393
    hdu 1564
    hdu 1720
    hdu 1342
    SQL技巧(sp_procedure_params_rowset,SQL中设置数据值为null)
    Control ‘dg’ of type 'GridView' must be placed inside a form tag with runat=server
    GridView事件中获取rowIndex值
  • 原文地址:https://www.cnblogs.com/springsnow/p/9428732.html
Copyright © 2020-2023  润新知