監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

Web服務(wù)與二進(jìn)制傳輸

申請免費(fèi)試用、咨詢電話:400-8352-114

AMTeam.org

Web服務(wù)與二進(jìn)制傳輸

王凌峰  

本文將要討論 XML 二進(jìn)制對象的序列化。在這個(gè)例子中,我們構(gòu)造的 Web 服務(wù)將以二進(jìn)制數(shù)組的形式輸出一張圖片,它也可以是 mp3、應(yīng)用程序或者任何其它二進(jìn)制信息。

可能的用途包括 Web 服務(wù)發(fā)布最新的新聞?wù)掌?、gif 格式的統(tǒng)計(jì)圖表等。這些圖片當(dāng)然可以直接發(fā)布在 Web 應(yīng)用程序的企業(yè)層上,但是如果公司僅僅需要向位于 Internet 上的圖片供應(yīng)商發(fā)出請求就能得到它們,豈不更好?

- “嗨,我是 cshrp.net 上的一個(gè)網(wǎng)頁。我想得到這些數(shù)據(jù)的餅狀圖和相關(guān)信息??臁!?

- “哦,網(wǎng)頁你好。沒問題,圖片很快就到,正在進(jìn)行 HTTP 傳輸,請稍候?!?

- “哇,酷。請問能否在一小時(shí)后根據(jù)新的數(shù)據(jù)繪出餅狀圖再傳給我?”

- “呵呵,好說,好說。我是 web 服務(wù),沒有做不到的?!?
 
對,就這樣。明白了?好,來看看下列代碼,我們將用它來傳送一張示范圖片 C:InetpubwwwrootwebservicesSample.jpg 。
 
<%@ WebService Language="C#" Class="Binaries"%>
using System;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web.Services;
 
public class Binaries : WebService
{
[WebMethod()]
public Byte[] GetBinary()
{
Image sample = new Bitmap(@"C:InetpubwwwrootwebservicesSample.jpg");
MemoryStream output = new MemoryStream();
sample.Save(output, ImageFormat.Jpeg);
 
return output.GetBuffer();
}
}
 
既然我們要處理的是圖片,當(dāng)然要包含名字空間 System.DrawingandSystem.Imaging 。我們要建立的是一個(gè) Web 服務(wù),并且用到了 MemoryStream 對象,因此還要包含 System.IOandSystem.Web.Service 。

代碼十分簡單。然后,我們創(chuàng)建了包含那張圖片的 image 對象。接下來,我們創(chuàng)建 MemoryStream 以容納圖片,并且以 MemoryStream 和文件格式作為參數(shù)調(diào)用 image 對象的 Save 方法。

Web 服務(wù)一旦投入運(yùn)行,就能等待客戶端了。在本例中,客戶端是一個(gè) windows 應(yīng)用程序。但它也可以是能與 Web 服務(wù)交互的 html、wml、xml等等。

我們使用一個(gè)代理服務(wù)類讓系統(tǒng)將 Web 服務(wù)看成本地類。代理服務(wù)類可以看成介于本地應(yīng)用程序和 Web 服務(wù)之間的通道。它能將你的要求翻譯成 Web 服務(wù)器的語言。

有一個(gè)小巧玲瓏的公用程序 wsdl.exe 可以充當(dāng)代理服務(wù)類。順便提一句,WSDL 是 Web 服務(wù)描述語言的縮寫,它是一種用于描述 Web 服務(wù)的 XML 格式,可以讓人們知道代理服務(wù)類都做些什么。通過把 WSDL 作為 web 服務(wù)的查詢字串就能得到它的 wsdl 描述:
 
myWebService.asmx?WSDL
 
這個(gè) url 可以作為參數(shù)傳遞給 wsdl.exe:
 
wsdl
http://local/myservice.asmx?WSDL
 
我們根據(jù) Web 服務(wù)類命名 C# 代碼文件。比如上面那段代碼的文件名就是 Binaries.cs 。現(xiàn)在把它編譯成一個(gè) module :
 
csc/t:module Binaries.cs
 
然后把下列源代碼文件和 .NET 模組文件放在同一目錄下:
 
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;
 
 
public class BinaryConsumer : Form
{
Button btnLoad;
PictureBox pbxBinaryImage;
Binaries myService;
 
public BinaryConsumer()
{
myService = new Binaries();
this.btnLoad = new Button();
this.pbxBinaryImage = new PictureBox();
 
this.btnLoad.Location = new Point(176, 240);
this.btnLoad.Name = "btnLoad";
this.btnLoad.Text = "Load Image";
this.btnLoad.Click += new EventHandler(this.btnLoad_Click);
 
this.pbxBinaryImage.Location = new Point(24, 8);
this.pbxBinaryImage.Name = "pbxBinaryImage";
this.pbxBinaryImage.Size = new Size(232, 224);
this.pbxBinaryImage.TabStop = false;
 
this.AutoScaleBaseSize = new Size(5, 13);
this.ClientSize = new Size(292, 273);
this.Controls.AddRange(new Control[] {
this.btnLoad,
this.pbxBinaryImage});
this.Name = "BinaryConsumer";
this.Text = "BinaryConsumer";
 
}
 
static void Main() 
{
Application.Run(new BinaryConsumer());
}
 
private void btnLoad_Click(object sender, System.EventArgs e)
{
byte[] image = myService.GetBinary();
 
MemoryStream memStream = new MemoryStream(image);
 
Bitmap bm = new Bitmap(memStream);
 
pbxBinaryImage.Visible = false;
pbxBinaryImage.Image = bm;
pbxBinaryImage.Visible = true;
}
}
 
這就是我們的客戶端。大部份代碼都是用戶接口,不管它,直接看這一段:
 
private void btnLoad_Click(object sender, System.EventArgs e)
{
byte[] image = myService.GetBinary();
 
MemoryStream memStream = new MemoryStream(image);
 
Bitmap bm = new Bitmap(memStream);
 
pbxBinaryImage.Visible = false;
pbxBinaryImage.Image = bm;
pbxBinaryImage.Visible = true;
}
 
這段代碼用于輸出圖片。它被關(guān)聯(lián)到了按鈕 btnLoad 上。單擊此按鈕,Web 服務(wù)就會把請求的圖片傳過來。注意,我們在一開始就創(chuàng)建了一個(gè) Binaries 對象 myService 。再有,是否還記得,我們的 Web 服務(wù)包含一個(gè) GetBinary 方法 ,作用是返回圖片的確切字節(jié)數(shù)??蛻舳撕?Web 服務(wù)之間的各種調(diào)用和數(shù)據(jù)經(jīng)過 SOAP 序列化,以 HTTP 方式來回傳遞。整個(gè)過程就是這樣。

注意:代碼可以從
http://www.cshrp.net/content/code/binaries.zip 下載到。經(jīng)過編譯的代理服務(wù)類在 beta 2 下運(yùn)行通過,但是在 Final 版則不行,除非使用新的代理服務(wù)類 wsdl.exe 。好了,祝一切順利。 

發(fā)布:2007-03-25 10:35    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章:
上海OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢