这两天,遇到了一个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 。