SilverLight学习笔记--Silverlight中HttpWebRequest通讯

   HttpWebRequest 是 .net 基类库中的一个类,在命名空间 System.Net 下面,用来使用户通过 HTTP 协议和服务器交互。 HttpWebRequest 对 HTTP 协议进行了完整的封装,程序使用 HTTP 协议和服务器交互主要是进行数据的提交,通常数据的提交是通过 GET 和 POST 两种方式来完成。
   HttpWebRequest常用命令如下:
  HttpWebRequest  -  对指定的 URI 发出请求
  Create() 
-  初始化一个 WebRequest
  BeginGetResponse() 
-  开始对指定 URI 资源做异步请求
  EndGetResponse() 
-  结束对指定 URI 资源做异步请求
  HttpWebResponse 
-  对指定的 URI 做出响应
  GetResponseStream() 
-  获取响应的数据流
   需要注意的是: HttpWebRequest使用基于代理的异步编程模型,在HTTP响应返回时引发的HttpWebRequest回调不是在UI线程上返回的,因此在该回调中需要额外代码处理UI,否则就会产生"跨线程访问无效"错误。
   在本例中我们将通过两种方式来编写处理UI的额外代码,即解决"跨线程访问无效"的问题(当然是在Client成功向Server端发送信息,以及Server端成功向Client端传回数据的前提下)。
    注:在实际应用时,如果我们要更新UI,则我们常使用silverlight支持的另一种发送HTTP请示的方式即WebClient方式,此方式与HttpWebRequest不同处在于,WebClient方式使用基于事件的异步编程模型,在HTTP响应返回时引发的WebClient回调是在UI线程中调用的,因此可用于更新UI元素的属性,例如把HTTP响应中的数据绑定到UI的指定控件上进行显示。
    另注:在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型,有以下三种类型:
      application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。   
      multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
      text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
   本例,我们将在两个按钮中分别采用"application/x-www-form-urlencoded"和"text/plain"方式来编码提交数据到服务器端
新建Silverlight应用程序

SilverLight学习笔记--Silverlight中HttpWebRequest通讯
程序用户界面如下:


SilverLight学习笔记--Silverlight中HttpWebRequest通讯
如图所示,界面上有两个按钮,两个按钮的后台操作分别为:
  按钮"用Thread配合AsynchronazationContext解决跨线程访问无效问题"--当点击后
  1、将把字符串"This Msg Come From Client"传递到服务器端
  2、uri地址是指定的asp页面(此处是Default.aspx页面)
  3、编码方式采用text/plain
  4、服务器端接收到客户端传来的数据后,用StreamReader把传参接收下来,并在此基础上加入服务器端数据并返回
  5、客户端采用"Thread配合AsynchronazationContext方式"把服务器端返回的数据显示在UI控件上
   按钮"用Socket配合AsynchronazationContext解决跨线程访问无效问题"--当点击后
  1、将把字符串"This Msg Come From Client"传递到服务器端
  2、uri地址是指定的Handler(此处是ServerHandler.ashx)
  3、编码方式采用application/x-www-form-urlencoded
  4、服务器端接收到客户端传来的数据后,用Params.Get()方法把传参接收下来,并在此基础上加入服务器端数据并返回
  5、客户端采用"Socket配合AsynchronazationContext解决跨线程访问无效问题"把服务器端返回的数据显示在UI控件上
  以下是代码内容:
   Page.xaml界面设计代码
Code

  Page.xaml.cs后台代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;
using  System.IO;
using  System.Text;
using  System.Threading;   // 解决线程同步问题
using  System.Net.Sockets;

namespace  SLHttpWebRequest
{
    
public partial class Page : UserControl
    
{

        System.Net.Sockets.Socket socket;
        
private SynchronizationContext currentContext;

        
string clientMsg = "This Msg Come From Client";
        
string resStr = "";

        
public Page()
        
{
            InitializeComponent();
            
this.currentContext = SynchronizationContext.Current;  
        }


        
用Thread配合AsynchronazationContext解决跨线程访问无效问题&text/plain传参"

        
用Socket配合AsynchronazationContext解决跨线程访问无效问题&application/x-www-form-urlencoded方式传参


    }

}


  Default.aspx代码
Code
 ServerHandler.ashx代码
Code
运行后效果如下
SilverLight学习笔记--Silverlight中HttpWebRequest通讯

 
前往:Silverlight学习笔记清单
本文程序在Silverlight2.0和VS2008环境中调试通过。本文参照了部分网络资料,希望能够抛砖引玉,大家共同学习。
(转载本文请注明出处)

你可能感兴趣的:(silverlight)