C# 通過WebService方式 IIS釋出網站 上傳檔案到伺服器的虛擬機器下 詳盡方法
應用場景:要將本地的檔案 上傳到 伺服器的虛擬機器上
網路環境:公司區域網(如下圖中 第二種)
開發環境:VS2010
伺服器環境:WinServer2008 虛擬機器環境:WinServer2008
我的程式結構目錄
AppSrvice 是服務檔案 將來發布了以後要放到伺服器上, WindowFormsAppp 是Winform程式
第一步:建立一個新的: Windows窗體應用程式
關鍵程式碼如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Security.Cryptography; using System.IO; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //localhost.WebService1 client = new localhost.WebService1(); ServiceReference1.WebService1SoapClient client = new ServiceReference1.WebService1SoapClient(); //上傳伺服器後的檔名 一般不修改檔名稱 int start = textBox1.Text.LastIndexOf("\\"); int length = textBox1.Text.Length; string serverfile = textBox1.Text.Substring(start + 1, length - textBox1.Text.LastIndexOf(".")) + DateTime.Now.ToString("-yyyy-mm-dd-hh-mm-ss") + textBox1.Text.Substring(textBox1.Text.LastIndexOf("."), textBox1.Text.Length - textBox1.Text.LastIndexOf(".")); client.CreateFile(serverfile); //要上傳檔案的路徑 string sourceFile = textBox1.Text ; string md5 = GetMD5(sourceFile); FileStream fs = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); int size = (int)fs.Length; int bufferSize = 1024 * 512; int count = (int)Math.Ceiling((double)size / (double)bufferSize); for (int i = 0; i < count; i++) { int readSize = bufferSize; if (i == count - 1) readSize = size - bufferSize * i; byte[] buffer = new byte[readSize]; fs.Read(buffer, 0, readSize); client.Append(serverfile, buffer); } bool isVerify = client.Verify(serverfile, md5); if (isVerify) MessageBox.Show("上傳成功"); else MessageBox.Show("上傳失敗"); } private string GetMD5(string fileName) { FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); MD5CryptoServiceProvider p = new MD5CryptoServiceProvider(); byte[] md5buffer = p.ComputeHash(fs); fs.Close(); string md5Str = ""; List<string> strList = new List<string>(); for (int i = 0; i < md5buffer.Length; i++) { md5Str += md5buffer[i].ToString("x2"); } return md5Str; } private void button2_Click(object sender, EventArgs e) { OpenFileDialog openDialog = new OpenFileDialog(); openDialog.Filter = "視訊檔案(*.avi,*.wmv,*.mp4)|*.avi;*.wmv;*.mp4"; if (openDialog.ShowDialog() == DialogResult.OK) { textBox1.Text = openDialog.FileName; } } } }
第二步:建立WebService
關鍵程式碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.IO; using System.Security.Cryptography; namespace StateGrid95598 { /// <summary> /// WebService1 的摘要說明 /// </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 WebService1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public bool CreateFile(string fileName) { bool isCreate = true; try { //首先設定上傳伺服器檔案的路徑 然後釋出web服務 釋出的時候要自己建一個自己知道的資料夾 "C:\NMGIS_Video\" "C:\NMGIS_Video\" fileName = Path.Combine(Server.MapPath("") + @"\Video\" + Path.GetFileName(fileName)); FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); fs.Close(); } catch { isCreate = false; } return isCreate; } [WebMethod] public bool Append(string fileName, byte[] buffer) { bool isAppend = true; try { //fileName = Path.Combine(@"C:\NMGIS_Video\" + Path.GetFileName(fileName)); fileName = Path.Combine(Server.MapPath("") + @"\Video\" + Path.GetFileName(fileName)); FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); fs.Seek(0, SeekOrigin.End); fs.Write(buffer, 0, buffer.Length); fs.Close(); } catch { isAppend = false; } return isAppend; } [WebMethod] public bool Verify(string fileName, string md5) { bool isVerify = true; try { fileName = Path.Combine(Server.MapPath("") + @"\Video\" + Path.GetFileName(fileName)); FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); MD5CryptoServiceProvider p = new MD5CryptoServiceProvider(); byte[] md5buffer = p.ComputeHash(fs); fs.Close(); string md5Str = ""; List<string> strList = new List<string>(); for (int i = 0; i < md5buffer.Length; i++) { md5Str += md5buffer[i].ToString("x2"); } if (md5 != md5Str) isVerify = false; } catch { isVerify = false; } return isVerify; } } }
第三步:釋出服務
選中服務專案,右鍵 釋出
釋出方法選擇:檔案系統
目標位置:是選擇你釋出後生成檔案的位置 自己隨便找個地方即可
然後點選 釋出
第四步:拷貝檔案到伺服器
將剛才釋出好的檔案拷貝到你要上傳到的伺服器的虛擬機器的指定目錄下
第五步:在虛擬機器上釋出網站
開啟虛擬機器的IIS 釋出一個網站 檔案路徑指向你剛才拷貝到虛擬機器上的檔案目錄
IP地址就是當前虛擬機器的IP 要設定為固定的IP
埠一定注意 不要與當前正在使用的埠衝突 建議更改一個
然後確定 釋出網站
選中剛才釋出的網站 ,右邊滾動條向下,選擇 預設文件 並雙擊
雙擊開啟後右邊點選新增按鈕 ,當剛才複製到虛擬機器當中的 .asmx 檔名新增到裡邊點確定
網站右鍵 ,管理網站,瀏覽 檢視發不好的網站是否可以訪問
我這裡瀏覽是可以訪問的:如下圖
第六步:設定虛擬機器網路環境
虛擬機器》編輯 或者 開始選單中 找到 Virtral Network Editor
開啟虛擬網路編輯器
Nat 設定裡邊 對映兩個埠 TCP、UDP型別各一個, 然後點選確定
宿主機的8070 埠對映到虛擬機器的“192.168.16.135”的8070埠了,因為web服務自動開放的埠是8070,所以,只要我們訪問 “http://192.168.1.54:8070”,就可以訪問到虛擬機器的8070埠,也就是web服務了 (這裡宿主機的埠可以改成其他埠,無需跟虛擬機器埠一致,我是為了省事都寫成了8070)
然後點選應用 確定 。。。 這裡設定好了以後就可以通過訪問虛擬機器的宿主機IP訪問到你虛擬機器上的服務
此時就可以通過其他任意機器訪問你的.asmx頁面 注意你的埠一定要正確 正如上面所說:這裡直接通過訪問宿主機的Ip就可以
第七步:為客戶端新增伺服器引用
專案右鍵 新增服務引用
新增服務地址 點選 前往 ,如果正確的話 會在下面顯示出你的服務頁面 然後點選確定
第八步:測試
執行客戶端測試
這裡顯示成功了 那麼我們去虛擬機器的目錄下看一看到底有沒有
這裡有兩個檔案 我測試了兩次 , 檔名稱 我在程式當中追加了當前時間的格式化字串,檔案大小也是對的。
有問題的可以在評論中提出,我會盡快回復。個人實踐,純手寫,喜歡可以點個贊,不喜勿噴!