WebService簡單使用

来源:http://www.cnblogs.com/shouce/archive/2016/04/11/5376931.html
-Advertisement-
Play Games

閱讀目錄 開始 簡單使用 非同步調用WebServeices WebServices驗證 相關概念及資源 WebServices:簡單理解--解決了不同平臺之間應用程式間通信的問題,數據以XML格式在程式間傳輸 實際的應用場景:例如 比價網 為什麼比價網可以從眾多的電商站點獲得用戶搜索的產品數據?We ...


閱讀目錄

WebServices:簡單理解--解決了不同平臺之間應用程式間通信的問題,數據以XML格式在程式間傳輸   實際的應用場景:例如 比價網 為什麼比價網可以從眾多的電商站點獲得用戶搜索的產品數據?WebServices就可以實現(註意:是“可以實現”,我並沒有確切的說就是這麼實現,也許有其他的方法) 回到頂部

簡單使用

1.在 "提供WebService服務" 站點中添加WebServices服務   2.再添加一個檢索數據的方法:SearchProduct(string searchKey){}
using System.Collections.Generic;
using System.Web.Services;

namespace 提供WebService服務 {
    /// <summary>
    /// ComplexCalculate 的摘要說明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的註釋。
    // [System.Web.Script.Services.ScriptService]
    public class ComplexCalculate : System.Web.Services.WebService {

        [WebMethod]//預設的WebServices服務
        public string HelloWorld() {
            return "Hello World";
        }

        //假設這是京東提供外部應用程式 訪問自己數據的服務
        //根據用戶搜索關鍵字 返回檢索結果
        private readonly Dictionary<string, string> dictionary = new Dictionary<string, string>();
        [WebMethod]//特性表明該方法可供外部訪問
        public string SearchProduct(string searchKey) {
            dictionary.Add("mx2", "聯通MX2 京東");
            dictionary.Add("小米2", "小米四核 京東");//模擬數據
            dictionary.Add("MeiZu", "MeiZu標準本 京東");
            return dictionary[searchKey];
        }
    }
}
 
3.直接運行ComplexCalculate.asmx可以看到

 

Chrome瀏覽器返回如下 其實無論返回什麼樣的數據,都會以XML格式包裝輸出,也正是由於任何平臺都認識XML,解決了數據的跨平臺通信問題, 當然現在Json慢慢的變為行業標準,已成為XML的替代品

 

4.外部站點 "調用WebServices服務" 調用localhost:1088檢索服務時 首先添加服務引用 如圖:

 

像我這種  提供WebServices服務 與 調用WebServices服務 在同一解決方案下 直接點擊發現就可以了(如果是互聯網上的WebServices,那將提供的asmx地址複製到地址框中,點擊前往,就可以得到服務).確定後,會將該服務相關的配置信息寫入Web.Config中,如下:
<?xml version="1.0" encoding="utf-8"?>

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>

    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="ComplexCalculateSoap" />
                <binding name="NeedValidateWsSoap" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:1808/ComplexCalculate.asmx"
                binding="basicHttpBinding" bindingConfiguration="ComplexCalculateSoap"
                contract="SimpleUse.ComplexCalculateSoap" name="ComplexCalculateSoap" />
            <endpoint address="http://localhost:1808/NeedValidateWS.asmx"
                binding="basicHttpBinding" bindingConfiguration="NeedValidateWsSoap"
                contract="AuthenticationPage.NeedValidateWsSoap" name="NeedValidateWsSoap" />
        </client>
    </system.serviceModel>
</configuration>

關於,第2和3步做什麼,待續,圖先放這。   5.使用WebServices的SimpleUse.aspx.cs代碼如下
using System;
using 調用WebServices服務.SimpleUse;

namespace 調用WebServices服務 {
    public partial class SimpleUsePage : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {
            //同步調用
            using(SimpleUse.ComplexCalculateSoapClient client = new ComplexCalculateSoapClient()) {
                Response.Write(client.SearchProduct("mx2"));
            }
        }
    }
}
  運行後顯示結果"聯通 MX2 京東",當然前提是提供WebServices服務必須開啟   是不是So easy!? 因為微軟讓它easy,如果是Java來做WebServices就沒這麼簡單了!   使用互聯網上免費的WebServices與上述大同小異,不啰嗦了. 回到頂部

非同步調用WebServeices

上述WebServices服務狠簡單,如果是一個狠複雜或者耗時的操作,那調用者豈不是要享受等待的煎熬?! 所以需要非同步調用WebServices 非同步調用有兩種方式: 1.上圖中添加索引服務時,有個"高級"選項,選擇之後,彈出"服務引用設置",我們選擇"生成非同步操作" 操作的背後,微軟幫我們針對SearchProduct方法生成了一個與之對應的非同步方法SearchProductAncys方法 UseAsync.aspx.cs後臺調用如下:
using System;
using 調用WebServices服務.SimpleUse;

namespace 調用WebServices服務 {
    public partial class UseAsync : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {
            using(SimpleUse.ComplexCalculateSoapClient client = new ComplexCalculateSoapClient()) {
                client.SearchProductCompleted += client_SearchProductCompleted; //委托 接收非同步響應結果
            }
        }

        void client_SearchProductCompleted(object sender, SearchProductCompletedEventArgs e) {
            Response.Write(e.Result);//輸出非同步返回結果
        }
    }
}

 

需要註意的是UseAsync.aspx頁面需要添加Async=true;允許接收非同步的配置

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UseAsync.aspx.cs" Async="true" Inherits="調用WebServices服務.UseAsync" %>
  2.第二種通過開啟一個後臺工作者,使用BackgroundWorker類,所屬命名空間:using System.ComponentModel;  
using System;
using System.ComponentModel;
using 調用WebServices服務.SimpleUse;

namespace 調用WebServices服務 {
    public partial class AsyncByWorker : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {
            BackgroundWorker background = new BackgroundWorker();
            //設置需要非同步執行的操作
            background.DoWork += background_DoWork;
            //接收非同步操作結果的"回調函數"
            background.RunWorkerCompleted += background_RunWorkerCompleted;
            //開始真正的執行非同步操作 不要遺漏
            background.RunWorkerAsync();
        }

        void background_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
            Response.Write(e.Result);//從Result中獲取結果
        }

        void background_DoWork(object sender, DoWorkEventArgs e) {
            using(SimpleUse.ComplexCalculateSoapClient client = new ComplexCalculateSoapClient()) {
                e.Result = client.SearchProduct("mx2");//執行結果寫入Result中
            }
        }
    }
}
前臺同上需要設置Async=true; 回到頂部

WebServices驗證

互聯網上提供的免費WebServices是任何人都可以使用的,而有些則需要用戶名、密碼才能使用,這些驗證是如何做到的呢?   方式有很多,這裡只說我知道也是最簡單的一種--通過Soap頭傳遞用戶名密碼進行身份校驗 步驟: 1.自定義MySelfSoapHeader繼承SoapHeader 並具有用戶名、密碼、身份校驗方法 2.在Services服務中添加SoapHeader特性及未初始化的MySelfSoapHeader實例 3.調用者對服務端MySelfSoapHeader實例化 同時為用戶名密碼賦值,提交至服務端 4.服務端返回驗證結果   MySelfSoapHeader.cs具有Name、Pwd欄位屬性 校驗方法如下
 
using System.Web.Services.Protocols;

namespace 提供WebService服務 {
    public class MySelfSoapHeader : SoapHeader {
        private string _name;
        private string _pwd;

        public string Name {get {return _name;}set {_name = value;}}

        public string Pwd {get {return _pwd;}set {_pwd = value;}
        }

        private bool ValidaResult(string name, string pwd) {
            if(name == "pizi" && pwd == "yimao") {
                return true;
            }
            return false;
        }

        public bool GetResult() {
            return ValidaResult(_name, _pwd);
        }
    }
}
 
添加NeedValidateWS服務
using System.Web.Services;
using System.Web.Services.Protocols;

namespace 提供WebService服務 {
    /// <summary>
    /// NeedValidateWS 的摘要說明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    public class NeedValidateWs : System.Web.Services.WebService {
        public MySelfSoapHeader MySoapHeader = null;//這裡是通過客戶端實例化的 不要new
        [SoapHeader("MySoapHeader")]
        [WebMethod(Description = "需要驗證的方法")]
        public string IsValid() {
            if(MySoapHeader.GetResult()) {
                return "驗證通過";
            }
            return "未通過驗證";
        }
    }
}

調用頁面
using System;
using 調用WebServices服務.AuthenticationPage;

namespace 調用WebServices服務 {
    public partial class ValidPage : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {
            using(AuthenticationPage.NeedValidateWsSoapClient client = new NeedValidateWsSoapClient()) {
                MySelfSoapHeader header = new MySelfSoapHeader();
                header.Name = "pizi";
                header.Pwd = "yimao";//驗證通過
                //header.Pwd = "sanmao";//未通過驗證
                Response.Write(client.IsValid(header));
            }
        }
    }
}
這種驗證方式存在數據的安全性問題,如果需要保證數據的安全性則使用加密演算法或者SSL等驗證方式,我瞭解的不多,所以不廢話了

 

回到頂部

相關概念及資源

SOAP:簡單對象訪問協議,在分散或分散式的環境中交換信息的簡單協議,基於XML協議

解決了三個問題:1.介面的自我描述;2.採用Http協議等常規協議,不用寫原始的Socket;3.基於Web伺服器,不占用80埠之外的埠.

Web Services平臺元素 XML:可擴展標記語言,用來描述數據 WSDL:(WebService Defination Language)是對WebService上的方法名、參數進行描述的協議.對介面的自描述. SOAP:(Simple Object Access Protocol)對參數、返回值以什麼樣的格式進行傳遞進行描述的協議.對報文的格式規範.            SOAP和HTTP的關係:SOAP基於Http協議的,和普通網頁不同的是網頁返回HTML,SOAP則是符合SOAP協議的XML數據. UDDI:用來自動發現WebService的協議   WebService優點:                          跨平臺、跨語言調用,可以跨防火牆(基於Web伺服器,不占用80埠之外的埠); WebService缺點:                          效率低.所以適用於兩個非內部系統的通訊(比如炒股軟體和證券交易所之間的通訊);                          安全問題,Web Service的沒有自身的安全機制,必須藉助http協議或IIS等宿主程式實現信息安全加密
WCF是對WebService、Socket、MQ等通訊方式的一個統一,底層還是採用這些通信協議,可以簡化這些程式的開發,不用再換不同通信協議的時候重寫代碼並且學一堆新的技術。所以WCF和WebService不是一個競爭取代關係。

WCF是對.Net Remoting、WebService、MQ等通訊方式的一個高級封裝,讓我們開發不同通訊協議的程式的時候很簡單,不用學更多的東西。並不是替代.Net Remoting、WebService、MQ這些東西。
  Web Services平臺元素 XML:可擴展標記語言,用來描述數據 WSDL:(WebService Defination Language)是對WebService上的方法名、參數進行描述的協議.對介面的自描述. SOAP:(Simple Object Access Protocol)對參數、返回值以什麼樣的格式進行傳遞進行描述的協議.對報文的格式規範.            SOAP和HTTP的關係:SOAP基於Http協議的,和普通網頁不同的是網頁返回HTML,SOAP則是符合SOAP協議的XML數據. UDDI:用來自動發現WebService的協議   WebService優點:         跨平臺、跨語言調用,可以跨防火牆(基於Web伺服器,不占用80埠之外的埠); WebService缺點:         效率低.所以適用於兩個非內部系統的通訊(比如炒股軟體和證券交易所之間的通訊);         安全問題,Web Service的沒有自身的安全機制,必須藉助http協議或IIS等宿主程式實現信息安全加密
 
http://blog.csdn.net/nealbzdn/article/details/204488 http://msdn.microsoft.com/zh-cn/library/vstudio/9z52by6a(v=vs.100).aspx http://msdn.microsoft.com/zh-cn/library/vstudio/w67h0dw7(v=vs.100).aspx http://dev.21tx.com/2009/02/28/11159.html http://dev.21tx.com/2009/02/24/14360_8.html http://blog.csdn.net/book_frank_xl http://www.shangxueba.com/jingyan/100145.html
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux Free命令各數字含義及Buffer和Cache的區別 Free 命令的各數字含義 命令演示 加上參數 ,顯示的單位為MB 按行詳解 total :物理記憶體的實際總量 used :總計分配給緩存(buffer+cache)的使用的數量,但是其中部分可能並未實際使用(註意:這裡不是實際使用 ...
  • 因為串口列印速度慢,調試程式會影響程式的真正效果,所以引入網路列印 debug_manager.h #ifndef _DEBUG_MANAGER_H #define _DEBUG_MANAGER_H #define APP_EMERG "" /* system is unusable */ #def... ...
  • I will gradually learn some instructions about Network in Linux. First, here are somethings about IPv4: There are A, B, C, D, E, 5 classes. (images co ...
  • 前段時間換成Mac電腦之後,發現有一點不爽,不能在Mac下寫入NTFS格式的磁碟,所以就去研究了一下。 解決方法有如下三種。 第一種,直接使用第三方軟體,如Paragon NTFS for MAC,Tuxera NTFS等,不過大部分都是收費的。有一款免費的是Mounty,我之前用了一下,我自己的機 ...
  • 代碼如下,實現了Linux系統的一些常見的監控變數,分享給大家@.·.@ ...
  • ...
  • 註:下麵用 [$] 標註的表示收費工具,但部分收費工具針對開源軟體的開發/部署/托管是免費的) 目錄 API 應用框架(Application Frameworks) 應用模板(Application Templates) 人工智慧(Artificial Intelligence) 程式集處理(As ...
  • flex 訪問WebService的方法有很多種,使用FLEX4中的"數據/服務"功能可以自動生成訪問WebService的代理類,這樣可以避免把所有的數據訪問都寫到MXML頁面上,便於重覆利用,同時可以直接導入後臺自定義數據類型,方便傳參。 直接上代碼:其中WebService介面 ? 1 2 3 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...