測試環境
Windows XP Professional SP3, .NET Framework 4.0, IIS 5, Visual Stdio 2010 (均安裝於同一台 PC)
前置作業
1) 建立網頁的實體目錄 C:\MyWebSite,並於該目錄下,建立 bin、image、service 三個子目錄 (Ex: C:\MyWebSite\bin)。
2) 建立存放上傳檔案的目錄 C:\MyUploadImage 。
3) 將複製一個 JPG 檔 (小於 1 MB) 至 C:\MyWebSite\image,並將其更名為 Boring_Face.jpg 。
建置測試網站
1) 呼叫 IIS 管理介面:開始 --> 設定 --> 控制台 --> 系統管理工具 --> Internet Information Services
2) 於 Internet Information Services 畫面中,依下列圖示進行操作。
3) 此時測試網站已建置完成,再依下列圖示設定 .NET 版本。
建置 WCF Restful Web Service
1) 建立一個名為 MyImageService 的 "WCF 服務應用程式" 專案。
2) 將此專案中的 IService1.cs 更名為 IImageService.cs:在方案總管中,將滑鼠指標移至 IService1.cs 並按下滑鼠右鍵;此時將出現選項,點選 "重新命名" 後,再輸入 IImageService.cs。
3) 將此專案中的 Service1.svc 更名為 ImageService.svc
3-1) 在方案總管中,將滑鼠指標移至 Service1.svc 並按下滑鼠右鍵;此時將出現選項,點選 "重新命名" 後,再輸入 ImageService.svc。
3-2) 在方案總管中,將滑鼠指標移至 Service1.svc 並按下滑鼠右鍵;此時將出現選項,點選 "檢視標記" 後,於出現的 ImageService.svc 檔案內容中,將 Service1 改為 ImageService。
3-3) 將ImageService.svc.cs 程式碼的 Service1 改為 ImageService。
4) IImageService.cs 程式內容
using System; using System.Collections.Generic; using System.Text; using System.ServiceModel; using System.ServiceModel.Web; using System.ServiceModel.Description; using System.IO; namespace MyImageService { [ServiceContract] public interface IImageService { [OperationContract] [WebInvoke(Method = "GET", UriTemplate = "/DownloadImage")] Stream DownloadImage(); [OperationContract] [WebInvoke(Method = "POST", UriTemplate = "/UploadImage?name={filename}")] void UploadImage(string filename, Stream picture); } }
5) ImageService.svc.cs 程式內容
using System; using System.Collections.Generic; using System.Text; using System.ServiceModel; using System.ServiceModel.Web; using System.ServiceModel.Description; using System.IO; namespace MyImageService { public class ImageService : IImageService { public Stream DownloadImage() { FileStream targetStream = File.OpenRead(@"C:\MyWebSite\Image\Boring_Face.jpg"); WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpg"; return targetStream; } public void UploadImage(string filename, Stream picture) { byte[] buffer = new byte[1024]; string path = Path.Combine(@"C:\MyUploadImage\", filename); int length = 0; using (Stream targetStream = File.Create(path)) { while ((length = picture.Read(buffer, 0, buffer.Length)) > 0) { targetStream.Write(buffer, 0, length); } } } } }
6) web.config 的 "system .serviceModel" 部分請依以下設定 (maxreceivedmessagesize 表示上傳圖片的最大 byte 數,此處設定為 1M bytes。)
7) 建置專案
※ 若發生 "命名空間 'System.ServiceModel' 中沒有型別或命名空間名稱 'Web' (您是否遺漏了組件參考?)" 錯誤時,請參考這篇文章。
8) 將建置所產生的 MyImageService.dll 複製到 C:\MyWebSite\bin 。
9) 將建置所產生的 ImageService.svc 複製到 C:\MyWebSite\service 。
10) 將 Web.config 複製到 C:\MyWebSite 。
建置 Client Winform 程式
1) 建立一個名為 MyImageService_Client 的 "Windows Form 應用程式" 專案。
2) 將畫面設置如下:
3) Form1.cs 程式內容
using System; using System.Drawing; using System.Windows.Forms; using System.IO; using System.Net; namespace MyImageService_Client { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btn_Download_Click(object sender, EventArgs e) { try { string url = "http://127.0.0.1/MyWebSite/Service/ImageService.svc/DownloadImage"; HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; request.Method = "GET"; request.ContentType = "image/jpeg"; using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { Stream resultStream = response.GetResponseStream(); pictureBox1.Image = new Bitmap(resultStream); response.Close(); } lbl_Message.Text = "Download Successfully!"; } catch (Exception ex) { lbl_Message.Text = ex.Message.ToString(); } } private void btn_Upload_Click(object sender, EventArgs e) { try { string url = "http://127.0.0.1/MyWebSite/Service/ImageService.svc/UploadImage?name=TEST.jpg"; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = "POST"; request.ContentType = "image/jpeg"; using (Stream requestStream = request.GetRequestStream()) { byte[] bytes = File.ReadAllBytes(@"C:\MyWebSite\image\Boring_Face.jpg"); requestStream.Write(bytes, 0, bytes.Length); } HttpWebResponse resp = (HttpWebResponse)request.GetResponse(); lbl_Message.Text = "Upload Successfully!"; } catch (Exception ex) { lbl_Message.Text = ex.Message.ToString(); } } } }
實際測試
1) 執行 MyImageService_Client (可於 Visual Studio 或產生 MyImageService_Client.exe 執行之),此時將出現剛才設計的視窗,點選 "Download" 功能鍵,下載 Boring_Face.jpg 的圖檔內容。
2) 點選 "Upload" 功能鍵,將圖檔上傳至 C:\MyUploadImage\TEST.jpg
3) 可見到圖檔已成功上傳。