WCF分佈式開發必備知識(3):Web Service 使用

參考地址:http://www.cnblogs.com/zhili/p/WebService.htmlhtml

1、WebService概述web

SOAP、WSDL、UDDI
SOAP(Simple Object Access Protocal,簡單對象訪問協議),是在分散或在分佈式環境中交換信息的簡單協議。
WSDL(Web Services Description Language,Web服務描述語言) 對WebService 的解釋說明文檔,描述Web服務發佈的XML格式
UDDI 統一描述、發現和集成(Universal Description, Discovery, and Integration)的縮寫,是Web服務的黃頁,它是一個基於XML的跨平臺的描述規範,可使世界範圍內的企業在互聯網上發佈本身所提供的服務供其餘客戶查詢使用。
趣味理解:
Web Service 比如是一個服務供應商;
SOAP 就像是兩個公司之間籤的合同,約束雙方按照必定的規範和標準作事;
WSDL就像說明書,告訴別人你有什麼,能給別人提供什麼服務;
UDDI比如你的公司須要在黃頁或工商註冊,方便別人查詢ajax

2、WebService執行過程api

 

  • 在客戶端上,建立了一個Web Services代理類的實例。該對象駐留在客戶端機器上。
  • 客戶端調用代理類上的方法
  • 客戶端機器將Web Services方法的參數序列化爲SOAP消息,而後經過傳送協議發送給Web Services。
  • Web Services底層結構接收SOAP消息並進行反序列化。它會建立Web Services的類的實例,同時調用對應的Web Services方法。
  • Web Services方法執行,並返回結果。
  • Web Services底層結構會將返回結果序列化爲SOAP消息,而後經過網絡發送回客戶端。
  • 客戶端將接收SOAP消息,而後將XML反序列爲返回值或任何輸出參數,並將它們傳遞給代理類的實例。
  • 客戶端接收返回值和全部輸出參數。

3、WebService的優缺點跨域

優勢:緩存

1.跨平臺:Web Services徹底基於XML(可擴展標記語言)、XSD(XMLSchema)等與平臺無關的行業標準。安全

2.自描述:Web Service使用WSDL進行自我描述,包括服務的方法、參數、類型和返回值等相關信息。網絡

3.跨防火牆:Web Service使用http協議進行通訊,能夠穿越防火牆。分佈式

缺點:網站

1.效率低下,不適合作單應用系統的開發。

2.安全問題:Web Services沒有自身的安全機制,必須藉助Http協議或IIS等宿主程序實現信息安全加密。

4、使用參數介紹

Web Service(Web 服務)提供如下屬性。

Namespace:默認是"http://tempuri.org/",此屬性的值包含 XML Web Service 的默認命名空間。XML 命名空間提供了一種在 XML 文檔中建立名稱的方法,該名稱可由統一資源標識符(URI)標識。使用XML命名空間,能夠惟一標識XML文檔中的元素或屬性於是,在 XML Web Service 的服務說明中,Namespace 被用作與 XML Web Service 直接相關的XML 元素的默認命名空間。若是不指定命名空間,則使用默認命名空間http://tempuri.org/。

Name:此屬性的值包含 XML Web Service 的名稱。在默認狀況下,該值是實現 XML Web Service 的類的名稱。

Description:此屬性的值包含描述性消息,此消息將在 XML Web Service 的說明文件(例如服務說明和服務幫助頁)生成後顯示給 XML Web Service 的潛在用戶。

 

WebMethod(Web 服務方法)有如下 6 個屬性。

Description:是對 Web Service 方法的描述信息。就像 Web Service 方法的功能註釋,可讓調用者看見的註釋。

EnableSession:指示 Web Service 是否啓動 Session 標誌,主要經過 Cookie 完成,默認爲 false。

MessageName:主要實現方法重載後的重命名:

TransactionOption:指示 Web Service 方法的事務支持。

CacheDuration:設置響應應在緩存中保留的秒數。這樣 Web Service 就不須要重複執行多遍,能夠提升訪問效率,而 CacheDuration 就是指定緩存時間的屬性。

 

5、代碼

TestWebService1.asmx文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace WebService
{
    /// <summary>
    /// TestWebService1 的摘要說明
    /// </summary>
    [WebService(Namespace = "http://www.anniya.com/api")]//
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要容許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消註釋如下行。 
    [System.Web.Script.Services.ScriptService]
    public class TestWebService1 : System.Web.Services.WebService
    {
        [WebMethod]
        [SoapHeader("myHeader")]
        public string HelloWorld(string name)
        {
            if (!myHeader.IsValid())
            {
                return "對不起,您沒有權限訪問";
            }
            return name + ",Hello World";
        }

        public MySoapHeader myHeader = new MySoapHeader();
        [WebMethod]
        public List<Student> GetStudent()
        {
           
            return new List<Student>()
            {
                new Student() {Id = 1, Name = "張三1"},
                new Student() {Id = 2, Name = "張三2"},
                new Student() {Id = 3, Name = "張三3"}
            };
        }

       [WebMethod(Description="根據學生列表進行處理")]
        public List<Student> GetStudentResultByStudentList(List<Student> student)
        {
            foreach (var stu in student)
            {
                stu.Name += ",已經處理過了";
            }
            return student;
        }

        



    }

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class MySoapHeader : SoapHeader
    {
        public string UserName { get; set; }
        public string   Password { get; set; }

        public bool IsValid()
        {
            if (UserName == "admin" && Password == "123")
            {
                return true;
            }
            else
            {
                return false;
            }
        }

    }

    
}

調用代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using  WebApplicationTestWebService.ServiceReference1;

namespace WebApplicationTestWebService
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            using (TestWebService1SoapClient client = new TestWebService1SoapClient())
            {
                MySoapHeader myHeader = new MySoapHeader();
                myHeader.UserName = "admin";
                myHeader.Password = "123";//用戶名和密碼要和調用的Web Service 一致
                Response.Write(client.HelloWorld(myHeader, "yxl") + "</br>");
                Response.Write("<hr/>");
                Student[] students = client.GetStudent();
                foreach (var student in students)
                {
                    Response.Write(student.Name+"</br>");
                }
                Response.Write("<hr/>");

                foreach (var student in client.GetStudentResultByStudentList(students))
                {
                    Response.Write(student.Name + "</br>");
                }
            }
          
        }
    }
}

若是使用ajax調用而且跨域的話,能夠在本地應用程序中調用webservice,而後在用js調用本地應用程序,這樣就不會跨域了

安全除了使用SoapHeader,還可使用SSL,配置SSL網站,還能夠控制訪問的IP地址,可是ip地址的維護不方便,不推薦使用

相關文章
相關標籤/搜索