webservice和wcf和web.api簡單介紹
轉自:無廢話的wcf等等
在.net平臺下,有大量的技術讓你創建一個HTTP服務,像Web Service,WCF,現在又出了Web API。在.net平臺下,你有很多的選擇來構建一個HTTP Services。我分享一下我對Web Service、WCF以及Web API的看法。
Web Service
1、它是基于SOAP協議的,數據格式是XML
2、只支持HTTP協議
3、它不是開源的,但可以被任意一個了解XML的人使用
4、它只能部署在IIS上
WCF
1、這個也是基于SOAP的,數據格式是XML
2、這個是Web Service(ASMX)的進化版,可以支持各種各樣的協議,像TCP,HTTP,HTTPS,Named Pipes, MSMQ.
3、WCF的主要問題是,它配置起來特別的繁瑣
4、它不是開源的,但可以被任意一個了解XML的人使用
5、它可以部署應用程序中或者IIS上或者Windows服務中
WCF Rest
1、想使用WCF Rest service,你必須在WCF中使用webHttpBindings
2、它分別用[WebGet]和[WebInvoke]屬性,實現了HTTP的GET和POST動詞
3、要想使用其他的HTTP動詞,你需要在IIS中做一些配置,使.svc文件可以接受這些動詞的請求
4、使用WebGet通過參數傳輸數據,也需要配置。而且必須指定UriTemplate
5、它支持XML、JSON以及ATOM這些數據格式
Web API
1、這是一個簡單的構建HTTP服務的新框架
2、在.net平臺上Web API 是一個開源的、理想的、構建REST-ful 服務的技術
3、不像WCF REST Service.它可以使用HTTP的全部特點(比如URIs、request/response頭,緩存,版本控制,多種內容格式)
4、它也支持MVC的特征,像路由、控制器、action、filter、模型綁定、控制反轉(IOC)或依賴注入(DI),單元測試。這些可以使程序更簡單、更健壯
5、它可以部署在應用程序和IIS上
6、這是一個輕量級的框架,并且對限制帶寬的設備,比如智能手機等支持的很好
7、Response可以被Web API的MediaTypeFormatter轉換成Json、XML 或者任何你想轉換的格式。
WCF和WEB API我該選擇哪個?
1、當你想創建一個支持消息、消息隊列、雙工通信的服務時,你應該選擇WCF
2、當你想創建一個服務,可以用更快速的傳輸通道時,像TCP、Named Pipes或者甚至是UDP(在WCF4.5中),在其他傳輸通道不可用的時候也可以支持HTTP。
3、當你想創建一個基于HTTP的面向資源的服務并且可以使用HTTP的全部特征時(比如URIs、request/response頭,緩存,版本控制,多種內容格式),你應該選擇Web API
4、當你想讓你的服務用于瀏覽器、手機、iPhone和平板電腦時,你應該選擇Web API
1.webservice例子介紹
原理:WebService是一個SOA(面向服務的編程)的架構,它是不依賴于語言,不依賴于平臺,可以實現不同的語言間的相互調用,通過Internet進行基于Http協議的網絡應用間的交互。
作用:主要用于數據交換、提供服務接口
優點:可跨平臺、部署簡單調用方便、無需額外客戶端支持
一、創建一個WebService服務
1.創建一個普通的Asp.Net Web應用程序,名稱為WebServiceDemo
2.在剛創建的web程序里添加一個WebService服務文件,名稱為TestService.asmx, 步驟看截圖
3.編寫TestService.asmx服務代碼,代碼如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace WebService
{
/// <summary>
/// TestService 的摘要說明
/// </summary>
[WebService(Namespace = "http://aaa.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允許使用 ASP.NET AJAX 從腳本中調用此 Web 服務,請取消對下行的注釋。
// [System.Web.Script.Services.ScriptService]
public class TestService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
public int Add(int i, int j)
{
return i + j;
}
}
}
4.進行編譯。然后F5運行剛創建的項目,我這邊的url是:http://localhost:50639/testservice.asmx , 如果能看到下面截圖就說明創建成功。
二、后臺調用方式
1.添加服務引用(可以添加一個新項目或在當前WebServiceDemo項目里做引用測試,這里我直接在WebServiceDemo做引用測試)
步驟:
a) 右擊WebServiceDemo項目里的引用,然后選擇“添加服務引用”
b) 彈出框地址填寫: http://localhost:50639/TestService.asmx, (注意:這里要換成你自己剛運行的服務地址)
c) 命名空間改為“TestServiceReference”,然后點擊“往前”按鈕進行測試,如無問題,點擊確定按鈕完成服務的引用
如下截圖:
2.在后臺cs調用,新建一個web.aspx頁面,在后臺鍵入如下代碼進行測試
protected void Page_Load(object sender, EventArgs e)
{
//RegisterHyperLink.NavigateUrl = "Register.aspx?ReturnUrl=" + HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"]);
//調用方法
TestServiceReference.TestServiceSoapClient testService = new TestServiceReference.TestServiceSoapClient();
int result = testService.Add(1, 2);
string hellowWorld = testService.HelloWorld();
Page.Response.Write("整型結果:" + result.ToString() + "。字符串結果:" + hellowWorld);
}
3.如看到結果,說明WebService的創建和引用成功了
三、前臺js調用方式
1.打開TestService.asmx,對代碼進行修改,以適應js調用,代碼如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace WebService
{
/// <summary>
/// TestService 的摘要說明
/// </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 TestService : System.Web.Services.WebService
{
public string GetWeekName(int day)
{
string result;
if (day > 6)
{
result = "輸入格式有誤";
}
else
{
DayOfWeek week = (DayOfWeek)day;
result = week.ToString();
}
return result;
}
}
}
2.前端頁面代碼(注意這里需要引入jquery文件)
<script type="text/javascript">
$(function () {
$.ajax({
type: 'POST',
url: 'TestService.asmx/GetWeekName',
data: '{ day: 4}',
dataType: 'json',
contentType: "application/json",
success: function (data) {
alert(data.d);
}
});
});
</script>
3.編譯WebService所在項目,然后運行我們剛寫好的前端頁面, 結果如下
4.看到結果了嗎,如果看到,說明你已經從創建一個WebService服務到使用都已經操作了一遍。舉一反三,剩下的看你的了
2.wcf例子介紹
一、概述
Windows Communication Foundation(WCF)是由微軟發展的一組數據通信的應用程序開發接口,可以翻譯為Windows通訊接口,它是.NET框架的一部分。由 .NET Framework 3.0 開始引入。
WCF的最終目標是通過進程或不同的系統、通過本地網絡或是通過Internet收發客戶和服務之間的消息。
WCF合并了Web服務、.net Remoting、消息隊列和Enterprise Services的功能并集成在Visual Studio中。
WCF專門用于面向服務開發。
二、基于Asp.net 的應用程序開發與面向服務開發

在基于Asp.net 的應用程序開發中,我們由客戶機的瀏覽器訪問應用程序服務器,然后通過應用程序服務器中的數據庫連接去連接數據庫服務器,讀取或是操作數據,有時候可能會 多一個文件服務器。大家可以觀察到,基本上所有的應用都放在了一臺服務器上,但對于一個,由于業務上的需要(如:與外部系統交互),一臺服務器很難支持所 有的應用。我們再看下面的圖:

客戶機使用瀏覽器訪問服務器A,服務器A為了業務需要與其他各種應用部署在服 務器B、C、D....再通過WCF技術互相通信,相互訪問...然而面向服務的好處不僅僅在此,他還提供了不同語言不同操作系統的可交互性..由于本文 不是介紹SOA的文章,感興趣的同學可以參見:SOA
三、第一個WCF程序
1. 新建立空白解決方案,并在解決方案中新建項目,項目類型為:WCF服務應用程序。建立完成后如下圖所示:

2.刪除系統生成的兩個文件IService1.cs與Service1.svc。
3.添加自定義的WCF【服務文件】User.svc,此時vs2010會自動生成WCF接口文件IUser.cs,我們在IUser中定義WCF方法ShowName,在User.svc.cs對該接口的方法進行實現。
代碼如下:
1 using System.ServiceModel;
2
3 namespace WCFService
4 {
5 [ServiceContract]
6 public interface IUser
7 {
8 [OperationContract]
9 string ShowName(string name);
10 }
11 }
12
13
14 namespace WCFService
15 {
16 public class User : IUser
17 {
18 public string ShowName(string name)
19 {
20 string wcfName = string.Format("WCF服務,顯示姓名:{0}", name);
21 return wcfName;
22 }
23 }
24 }
大家可以看到,在WCF中的接口與普通接口的區別只在于兩個上下文,其他的和我們正常學習的接口一樣。定義這個上下文要添加System.ServiceModel的引用。
[ServiceContract],來說明接口是一個WCF的接口,如果不加的話,將不能被外部調用。
[OperationContract],來說明該方法是一個WCF接口的方法,不加的話同上。
此時我們的第一個WCF服務程序就建立好了,將User.svc“設為起始頁”,然后F5運行一下試試,如下圖所示,VS2010自動調用了WCF的客戶端測試工具以便我們測試程序:

我們雙擊上圖中的 ShowName() 方法,出現如下圖:

在請求窗口中的值中輸入參數“你的姓名”,然后點擊“調用”,在響應窗口中會 出現返回值“WCF服務,顯示姓名:你的姓名”,說明測試成功,點擊下面的XML也可以看到XML的數據傳輸。我們現在建立好了服務的應用程序和業務邏 輯,即非常簡單的打印姓名的方法,測試也成功了。那么我們怎么用呢?
四、場景
我們設計的場景是在生產中經常應用的場景,把WCF程序寄宿在IIS之上。假 設場景如下:A服務器和B服務器。我們把我們剛剛建立的WCF程序“部署”在B服務器上(本教程的A,B服務器都放是我自己的一臺機器),我們的目標是在 A服務器的應用程序來訪問B服務器的WCF程序,實現服務器端的應用程序通訊。
五、將WCF程序寄宿在B服務器的IIS之上
首先我們將WCF應用程序發布一下,然后部署在B服務器的IIS之上,如下圖所示:

鼠標右鍵瀏覽Uesr.svc,在游覽器中出現如下圖所示,說明服務部署成功。

上圖中的http://localhost/User.svc?wsdl即為我們要引用的服務地址。
六、在客戶端[A服務器]創建服務的引用
我們這里以Web應用程序為例,建立地物理地址為本機,但是大家可以想像成B服務器是遠程計算機,localhost為一個其他的IP地址。
新建解決方案,并且創建ASP.NET Web應用程序的項目。命名為:WCFClient,如下圖所示:

(1)新建Asp.net頁面,命名為:WcfTest.aspx。
(2)添加在第五步中部署的服務的引用。如下圖所示:

此時彈出添加服務引用的窗體,如下圖所示:

我們在地址里寫上我們寄宿在IIS上的WCF服務的地址服務路徑,此處為:http://localhost/User.svc?wsdl, 在名稱空間處填寫WCFService[此名稱空間要在下面的客戶端中引用]然后點擊“前往”-->“確定”按鈕。此時我們完成了對服務的引用。我 們再次查看解決方案,里面多了Service References的文件夾,通過資源管理器打開后里面多了些文件,這些文件用于客戶端向服務端的調用,現在先不用管他。
七、使用WCF服務端的方法
WcfTest.aspx的代碼如下:
1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WCFTest.aspx.cs" Inherits="WCFClient.WCFTest" %>
2
3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml">
5 <head runat="server">
6 <title></title>
7 </head>
8 <body>
9 <form id="form1" runat="server">
10 <asp:TextBox ID="txtName" runat="server"></asp:TextBox><br />
11 <asp:Button ID="btnSubmit" runat="server" Text="測試WCF服務" OnClick="btnClick" />
12 </form>
13 </body>
14 </html>
15
16 using System;
17 using System.Collections.Generic;
18 using System.Linq;
19 using System.Web;
20 using System.Web.UI;
21 using System.Web.UI.WebControls;
22
23 //引用WCF服務的名稱空間
24 using WCFClient.WCFService;
25
26 namespace WCFClient
27 {
28 public partial class WCFTest : System.Web.UI.Page
29 {
30 protected void Page_Load(object sender, EventArgs e)
31 {
32
33 }
34
35 protected void btnClick(object sender, EventArgs e)
36 {
37 UserClient user = new UserClient();
38 string result = user.ShowName(this.txtName.Text);
39 Response.Write(result);
40 }
41 }
42 }
上面中的UserClient類是在添加引用的時候生成的服務端User類的客戶端代理類,一般客戶端代理類名稱都會是**Client。我們運行一下看下效果。

通過以上的例子,我們完成了由A服務器的應用向B服務器中WCF提供的方法的調用。這個例子比較簡單,對于經常開發B/S結構應用程序的同學們來說比較好理解。
八、說明:因為網上的入門教程比較少,本教程只做入門,后面會繼續講些其他入門的東西,深入的請看園子里:Artech 大哥的文章。
九、代碼下載:
十、版權
轉載請注明出處:http://www.rzrgm.cn/iamlilinfeng
啟動 Visual Studio 時,從開始頁中選擇新項目。或者,從文件菜單中,選擇新建,然后項目.
在模板窗格中選擇已安裝的模板和展開Visual C#節點。在Visual C#中,選擇Web。在項目模板的列表中,選擇ASP.NET MVC 4 Web 應用程序。"HelloWebAPI"項目命名并單擊確定.

在新的 ASP.NET MVC 4 項目對話框中,選擇Web API并單擊確定.

添加Model
一個Model對象,表示您的應用程序中的數據模型。ASP.NET Web API 可以自動序列化到 JSON、 XML 或一些其他格式,然后將序列化的數據寫入 HTTP 響應消息的正文。只要客戶端可以讀取序列化格式,它可以反序列化對象。大多數客戶端可以解析 XML 或 JSON。讓我們首先創建一個簡單的Model,此示例中用來代表一種產品。如果解決方案資源管理器中不可見,請單擊視圖菜單,然后選擇解決方案資源管理器。在解決方案資源管理器中,右鍵單擊模型文件夾。從上下文菜單中,選擇添加,然后選擇類.

命名類"Product"。下一步,將下列屬性添加到 Product類。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace HellowWebApi.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
}
控制器是一個對象,用于處理 HTTP 請求。如果您使用過 ASP.NET MVC ,然后您已熟悉控制器。那么同樣應用在Web API 中,但是Web API 中的控制器從ApiController類而不是控制器類派生的。還有一個主要區別是 Web API 控制器上的行動返回不是視圖,而是返回數據。
添加一個新的控制器,如下所示:
在解決方案資源管理器中,右鍵單擊控制器文件夾。選擇添加,然后選擇控制器.

添加控制器向導中,命名為"ProductsController"的控制器。在模板下拉列表中選擇空 API 控制器。然后單擊添加.


添加控制器向導將創建一個名為控制器文件夾中的 ProductsController.cs 文件。
添加下面的實現:
using HellowWebApi.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
namespace HellowWebApi.Controllers
{
public class ProductsController : ApiController
{
Product[] products = new Product[]
{
new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
};
public IEnumerable<Product> GetAllProducts()
{
return products;
}
public Product GetProductById(int id)
{
var product = products.FirstOrDefault((p) => p.Id == id);
if (product == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return product;
}
public IEnumerable<Product> GetProductsByCategory(string category)
{
return products.Where(
(p) => string.Equals(p.Category, category,
StringComparison.OrdinalIgnoreCase));
}
}
}
這只是一個簡單的模擬實現,控制器類內部使用固定數組來模擬數據存儲產品。當然,在實際的應用程序,將從數據庫中查詢或使用一些其他外部數據源。
控制器定義返回產品清單的三種方法:
GetAllProducts方法 返回IEnumerable <Product>類型的產品的整個列表。GetProductById方法 根據產品Id查找一個單一的產品。GetProductsByCategory方法 返回與指定類別的所有產品。
每個控制器上的方法映射到一個 URI:
| 控制器的方法 | URI |
|---|---|
| GetAllProducts | /api/products |
| GetProductById | /api/products/id |
| GetProductsByCategory | /api/products/?category=category |
客戶端可以調用該方法,通過發送一個 HTTP GET 請求的 uri。稍后,我們來看看這種映射如何完成的。首先,讓我們試試看。
使用瀏覽器調用 Web API
打開瀏覽器 輸入http://localhost:xxxx/api/products/。(替換"xxxx"為實際的端口數目。)
具體的結果取決于您所使用的 web 瀏覽器。Ie 瀏覽器將提示您打開或保存一個名為Product的"文件".

"文件",實際上就是 HTTP 響應的正文。單擊打開。在打開方式對話框中選擇記事本。單擊確定,出現提示時,單擊打開。該文件應包含數組的產品 JSON 表示形式:

在Mozilla Firefox,將顯示為 XML 格式在瀏覽器中。

差異的理由是 Ie 和火狐瀏覽器發送標頭接受不同,因此 web API 在響應中發送不同的內容類型。
可以嘗試請求瀏覽到這些 Uri:
?http://localhost:xxxx/api/products/1
?http://localhost:xxxx/api/products?category=hardware
第一次應返回的條目 id 等于 1。第二個應回到"硬件"所有類別的產品平等的列表,(在本例中,單個項目)。
使用Javascript 和 jQuery 調用 Web API
在前一節中,我們調用直接從瀏覽器請求的 web API。但大部分的 web Api由客戶端應用程序以編程方式使用。所以讓我們寫一個簡單的 javascript 客戶端。在解決方案資源管理器中,展開視圖文件夾中。雙擊以打開一個名為 Index.cshtml 的文件。

Index.cshtml使用razor 視圖引擎呈現,本例中我們不使用任何的razor 語法,我們使用純html和javascript的方式。
將文本修改為以下內容:
<!DOCTYPE html>
<html lang="en">
<head>
<title>ASP.NET Web API</title>
<link href="http://www.rzrgm.cn/Content/Site.css" rel="stylesheet" />
<script src="http://www.rzrgm.cn/Scripts/jquery-1.7.1.min.js" type="text/javascript">
// TODO Add script
</script>
</head>
<body id="body" >
<div class="main-content">
<div>
<h1>All Products</h1>
<ul id="products"/>
</div>
<div>
<label for="prodId">ID:</label>
<input type="text" id="prodId" size="5"/>
<input type="button" value="Search" onclick="find();" />
<p id="product" />
</div>
</div>
</body>
</html>
獲取產品的列表
若要獲取產品的列表,"api/products"發送一個 HTTP GET 請求。您可以使用 jQuery,如下所示:
<script type="text/javascript">
$(document).ready(function () {
// Send an AJAX request
$.getJSON("api/products/",
function (data) {
// On success, 'data' contains a list of products.
$.each(data, function (key, val) {
// Format the text to display.
var str = val.Name + ': $' + val.Price;
// Add a list item for the product.
$('<li/>', { text: str })
.appendTo($('#products'));
});
});
});
</script>
GetJSON函數發送 AJAX 請求。響應將是 JSON 對象的數組。GetJSON的第二個參數是一個請求成功完成時調用的回調函數。
獲取產品 Id
若要獲取產品按 ID,將發送到 HTTP GET 請求"/id",其中id是產品 id。將下面的代碼添加到該腳本塊:
function find() {
var id = $('#prodId').val();
$.getJSON("api/products/" + id,
function (data) {
var str = data.Name + ': $' + data.Price;
$('#product').text(str);
})
.fail(
function (jqXHR, textStatus, err) {
$('#product').text('Error: ' + err);
});
}
下面的代碼顯示完整的 Index.cshtml 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<title>ASP.NET Web API</title>
<link href="http://www.rzrgm.cn/Content/Site.css" rel="stylesheet" />
<script src="http://www.rzrgm.cn/Scripts/jquery-1.7.1.min.js"
type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
// Send an AJAX request
$.getJSON("api/products/",
function (data) {
// On success, 'data' contains a list of products.
$.each(data, function (key, val) {
// Format the text to display.
var str = val.Name + ': $' + val.Price;
// Add a list item for the product.
$('<li/>', { text: str })
.appendTo($('#products'));
});
});
});
function find() {
var id = $('#prodId').val();
$.getJSON("api/products/" + id,
function (data) {
var str = data.Name + ': $' + data.Price;
$('#product').text(str);
})
.fail(
function (jqXHR, textStatus, err) {
$('#product').text('Error: ' + err);
});
}
</script>
</head>
<body id="body" >
<div class="main-content">
<div>
<h1>All Products</h1>
<ul id="products"/>
</div>
<div>
<label for="prodId">ID:</label>
<input type="text" id="prodId" size="5"/>
<input type="button" value="Search" onclick="find();" />
<p id="product" />
</div>
</div>
</body>
</html>
運行應用程序
按 f5 鍵以啟動調試應用程序。在 web 頁應如下所示:



浙公網安備 33010602011771號