由于项目需要,最近研究了下WebClient的数据传输。关于WebClient介绍网上有很多详细介绍,大概就是利用WebClient可以实现对Internet资源的访问。无外乎客户端发送请求,服务端处理请求、回应请求。所以,我下面就简单描述下学习过程中遇到的一些问题:

1.关于Winform客户端请求

WebClient wc = new WebClient();//初始化

webclient string path = "http://192.168.1.115:8089/Handler1.ashx";

Uri uri = new Uri(path + "?RequestType=uploaddata");

string str="Requestdata";

wc.UploadStringAsync(uri, str);

关于此处的UploadStringAsync方法,WebClient下有多个方法,UploadStringAsync是异步调用,服务器响应后会有一个回调函数,可以在回调函数里查看服务端返回来的信息。如下

void client_UploadStringCompleted(object o, UploadStringCompletedEventArgs e)

{

if (e.Error == null)

{

if (e.Result == "ok")

this.DialogResult = DialogResult.OK;

else

MessageBox.Show("相应处理", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}

}

但是client_UploadStringCompleted事件提前注册。

2.关于Web服务端处理请求

客户端发出了请求,如果请求的Url没有问题的话,服务端就会收到请求,这里注意到,之前请求的Url中有一个Handler1.ashx(一般处理程序),用来处理客户端发出的请求。这样Web服务端就可以直接在事件处理文件中处理请求信息,不需有前台页面。

public void ProcessRequest(HttpContext context)

{

if (context.Request["RequestType"] == "uploaddata")

{

context.Response.ContentType = "text/plain";

context.Response.Write("ok");

}

}

在if中可以对请求进行处理,然后向客户端发出响应的回应。

3.关于报错之“远程服务器返回错误(500):内部服务器错误”

之前在做简单客户端与服务端交互string类型的数据时并没有遇到这个问题,但是后来研究服务器如何向客户端返回datatable或者dataset数据时(一般在程序中都是要用到,程序基本不可能只有string数据交互),发现总是报这个错,查了一上午的资料,也没有解决自己的问题,网上的解决办法有很多种,例如:远程服务器是否更改了文件,远程服务器没有权限诸如此类,总之是服务端的问题,但是服务端的什么问题,由于没有办法测试服务端(因为Web服务端发布了的,这样winform端才能访问),所以一直不知道怎么解决。下午上班时,突然想到是不是自己的代码有问题。就在另一个程序上测试了自己的代码,发现语法上没问题,但是逻辑上有问题。这才终于解决了困扰自己的问题。之后再遇到这样的问题,首先就会去想是否代码问题,若不是,再翻阅相关资料进行查询。

4.关于服务端返回dataset数据

我所做的项目大概是这样的,客户端基本只负责数据显示与数据填写,然后将数据发送给服务端,服务端则负责与数据库的交互,我们都知道,涉及到数据库的交互,就难免会用到datatable,那我们应该怎么样把datatable发给客户端呢?网上查阅资料后,发现,可以将数据转化为byte数组,通过序列化与反序列化实现,大致代码如下

客户端请求

wc.UploadDataAsync(uri, new byte[] { });//uri见之前的代码

服务器响应并返回数据

DataTable table = sql.GetAircraftInfo();
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
DataSet ds = new DataSet();
ds.Tables.Add(table);
bf.Serialize(ms, ds);
byte[] bytes = ms.ToArray();
ms.Close();
context.Response.ContentType = "text/plain";
context.Response.BinaryWrite(bytes);

客户端反序列化数据

void client_UploadDataCompleted(object o, UploadDataCompletedEventArgs e)
{
  if (e.Error == null)
  {
     byte[] bytes = e.Result;
     MemoryStream ms = new MemoryStream(bytes);
     BinaryFormatter bf = new BinaryFormatter();
     ms.Position = 0;
     DataSet ds = bf.Deserialize(ms) as DataSet;
     DataTable table = ds.Tables[0];//得到table数据
 }
}

以上均为自己的拙见,若有不对,敬请批评指正。欢迎交流。(后期应该会继续更新)

winform客户端利用webClient实现与Web服务端的数据传输的更多相关文章

  1. Delphi XE5通过WebService开发Web服务端和手机客户端

    Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices  stand-alone vcl applicati ...

  2. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  3. 如何提高Web服务端并发效率的异步编程技术

    作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...

  4. Request对象 --web浏览器向web服务端的请求

    一]Request对象常用方法        1)StringBuffer getRequestURL()            url表示访问web应用的完整路径            2)Stri ...

  5. Web服务端性能提升实践

    随着互联网的不断发展,日常生活中越来越多的需求通过网络来实现,从衣食住行到金融教育,从口袋到身份,人们无时无刻不依赖着网络,而且越来越多的人通过网络来完成自己的需求. 作为直接面对来自客户请求的Web ...

  6. wsgiref手写一个web服务端

    ''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ...

  7. Rsync同步部署web服务端配置

    Rsync同步部署web服务端配置 1,参数详解: -v, --verbose 详细模式输出. -q, --quiet 精简输出模式. -c, --checksum 打开校验开关,强制对文件传输进行校 ...

  8. 客户端 new socket时候 就像服务端发起连接了

    客户端 new socket时候  就像服务端发起连接了

  9. web服务端的架构演变

    此文已由作者肖凡授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近Lofter项目碰到很多性能上的问题,特别是数据库相关的,每次推送后,告警就会第一时间到来.这些问题随着产 ...

随机推荐

  1. MySQL 5.6查询优化器新特性的“BUG” eq_range_index_dive_limit

    本文转自 http://www.imysql.cn 最近碰到一个慢SQL问题,解决过程有点小曲折,和大家分享下. SQL本身不复杂,表结构.索引也比较简单,不过个别字段存在于多个索引中. CREATE ...

  2. MySQL中如何查看“慢查询”,如何分析执行SQL的效率?

    一.MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句 1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句. 2,long_query_time ...

  3. js对特殊字符转义、时间格式化、获取URL参数

    /*特殊字符转义*/ function replace_html(str) { var str = str.toString().replace(/&/g, "&" ...

  4. 通过pip安装模块

    环境:ubuntu,python2/3 命令: pip3 install ipy # 通过pip3给python3.x安装ipypip3 install --upgrade pip # 升级pippi ...

  5. 深入浅出MFC[摘记]

    1.Windows程序的运行本质:基于消息,事件驱动(Message Based,Event Driven).2.程序调用GetMessage API循环获取消息,程序的生命靠它来推动. MSG ms ...

  6. Eclipse中怎么安装TestNG单元测试框架

    在进行使用的eclipse的进行开发的代码中,必然就会需要进行单元测试,在单元测试的情况提供较多的框架单元测试,例如使用junit单元测试,而在国外进行开发较好的单元测试,提供了较好的测试的报告,ju ...

  7. js动画之多物体运动

    多个物体这不能使用一个定时器了,要给每个物体一个定时器 <!DOCTYPE html> <html lang="en"> <head> < ...

  8. android-webview开发中的各种使用方法(持续更,尽量全)

    最新坑A:(没看过的可以从下面开始处看起): 测试部门测出来一个坑,当多次点击退出后,会出现app崩溃现象,报如下错误: java.lang.IllegalArgumentException: Rec ...

  9. C++ 类模板的使用

    从事C++挺久了,在前段时看书时,发现高手,都是在写模板无,泛型编程,顿感差距.自己连模板都没有写,于是就小小的研究了下模板的用法. 模板简而言之就是对某此对象的相同方法,或处理方式,进行归纳,总结, ...

  10. Linux 命令 find

    find命令的基本格式是:find [路径] [选项] [操作]路径是find命令所查找的范围,如用.来表示当前目录,用/来表示根目录,选项用于指定查找条件,如:可以指定按照文件的属主,更改时间文件类 ...