這兩天,遇到了一個winform聯網獲取數據的問題,於是從網上搜了些資料學習了一下,完了之后,也不能忘記總結。下面我就簡單談一下WebClient類的常見用法。
首先,我先談一下我對WebClient類中這些方法的操作方式的看法。我想,很多人可能跟我一樣,覺得MSDN對這個類的很多解釋和案例都讓人看起來覺得蛋疼,因為,解釋的比較含糊(或者說比較官方),舉得例子吧,也太簡單了,並且,只有客戶端的代碼,沒有服務器端的代碼。這些東西都讓人覺得WebClient這種操作方式挺神秘的。其實,真的沒有什么神秘的。服務器端,就是一個網頁(這個就是讓人不知為何物的CRI資源),這個網頁就跟一般的網頁只有一點不一樣,就是,如果需要向客戶端返回數據的話,用Response.write()方法輸出,這樣子就能被客戶端獲取到了。至於為什么能被客戶端獲取到,那我就不曉得了,這個問題得去問微軟。客戶端的代碼,比較簡單無非就是字符串啊,流啊,等。兩種提交的方式有必要說一下,一種是同步,一種是異步。
這種方式,比較適合於桌面軟件聯網訪問數據庫。其實,是桌面軟件訪問某個你做好的頁面,把某些參數傳到那個頁面中,然后,你在那個網頁中,根據傳遞過來的參數,把某些跟數據庫有關的業務邏輯處理一下,然后再返回客戶端。
下面,我貼出來一些代碼,以便更好地理解WebClient。
功能一:
向服務器提交數據:
客戶端代碼:
private void btn_sent_Click(object sender, EventArgs e)
{
string data = this.textBox1.Text.ToString();
Uri endpoint = new Uri("http://localhost:3778/Default2.aspx");//這個你可以根據自己的本地端口修改
WebClient client = new WebClient();
client.Encoding = Encoding.UTF8;
//這是一種異步執行的方法,當數據下載完之后,會觸發UploadStringCompleted 事件,
// 所以,我們注冊這個事件
client.UploadStringCompleted +=
new UploadStringCompletedEventHandler(client_UploadStringCompleted);
client.UploadStringAsync(endpoint, "POST", data);
}
/// <summary>
/// 下載完數據之后,就會調用這個方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
MessageBox.Show(e.Result);
}
服務器端代碼:
protected void Page_Load(object sender, EventArgs e)
{
//獲取從客戶端傳來的信息
int length = Request.ContentLength;
byte[] bytes = Request.BinaryRead(length);
string txtContent =System.Text.Encoding.UTF8.GetString(bytes);
//服務器在這里可以完成業務邏輯。舉個例子,如果從客戶端傳過來一條SQL語句,
//那么,在這里就可以執行這條Sql語句。
//從服務器端返回信息
Response.ContentType = "text/plain";
Response.Write(txtContent);
}
功能二:根據某些參數,從服務器檢索數據,並接受該數據
客戶端代碼:
string tranType = "TextStr";//第一個參數
sting tranType="weather"; //第二個參數。這兩個參數可以根據具體的邏輯改寫
Uri endpoint = new Uri(String.Format("http://localhost:3778/Default.aspx?infoType=
{0}&tranType={1}", infoType, tranType));
WebClient client = new WebClient();
client.Encoding = Encoding.UTF8;
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.DownloadStringAsync(endpoint);
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
string RetStr = "";
if (e.Error == null)
{
//RetStr = "WebClient成功通訊";
RetStr = e.Result;
}
else
{
RetStr = e.Error.Message;
}
MessageBox.Show( RetStr); //顯示操作結果信息
}
服務器端代碼:
protected void Page_Load(object sender, EventArgs e)
{
//讀取從客戶端傳遞過來的參數
string infoTypeStr = Request.QueryString["infoType"];
string tranTypeStr = Request.QueryString["tranType"];
//根據參數,做一些相應的業務邏輯
string retValueStr ="處理邏輯后的返回結果";
Response.ContentType = "text/plain";
Response.Write(retValueStr);
}
這兩個功能,請參考http://blog.csdn.net/longlong821/article/details/7187524 。
功能三:想服務器上傳文件
這個思想就是把文件轉換成流的形式,然后發送到服務器端。
客戶端代碼:
WebClient client = new WebClient();
sting uriString="http://localhost:3778/Default2.aspx";
string fileName="D:\\1.txt"; //你要給些這個文件路徑
myWebClient.UploadFile(uriString, fileName);
服務器端:
private
void Page_Load(
object sender, System.EventArgs e)
{ // 獲取 http提交上傳的文件, 並改名保存
foreach (string key in Request.Files.AllKeys)
{
HttpPostedFile file = Request.Files[key];
string newFilename = DateTime.Now.ToString("yyMMddhhmmssffff")
+ file.FileName.Substring(file.FileName.LastIndexOf('.'));
try
{ //文件保存並返回相對路徑地址
file.SaveAs(this.serverPath + newFilename);
Response.Write("upload/" + newFilename);
}
catch (Exception)
{
}
}
}
{ // 獲取 http提交上傳的文件, 並改名保存
foreach (string key in Request.Files.AllKeys)
{
HttpPostedFile file = Request.Files[key];
string newFilename = DateTime.Now.ToString("yyMMddhhmmssffff")
+ file.FileName.Substring(file.FileName.LastIndexOf('.'));
try
{ //文件保存並返回相對路徑地址
file.SaveAs(this.serverPath + newFilename);
Response.Write("upload/" + newFilename);
}
catch (Exception)
{
}
}
}
上傳文件部分請參見 http://www.blogjava.net/kiant/articles/277929.html 。