.NEt专家博客!

【李会军】一步一步学Silverlight 2系列(13):数据与通信之WebRequest

上一篇 / 下一篇  2008-04-11 19:44:18

概述

Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。《一步一步学Silverlight 2系列》文章带您快速进入Silverlight 2开发。

本文将简单介绍在Silverlight 2中如何使用WebRequest进行数据的提交和获取。

简单示例

在本文中,我们仍然使用在一步一步学Silverlight 2系列(12):数据与通信之WebClient中用过的示例,只不过稍微做一点小的改动,使用WebRequest提交书籍编号数据,并根据书籍号返回价格信息。最终运行的结果如下图:
n)CRu/QvaE:U0
Oj0s3{LE9k f0

编写界面布局,XAML如下:

<GridBackground="#46461F">
1c`j!t9` `S_2~0<
Grid.RowDefinitions>
G?QzO7^7A0<
RowDefinitionHeight="40"></RowDefinition>
UW3@,ek0<
RowDefinitionHeight="*"></RowDefinition>
leH%K+P0<
RowDefinitionHeight="40"></RowDefinition>
]CFZ z0</
Grid.RowDefinitions>
2o#al3J(X l V,hR0<
Grid.ColumnDefinitions>
_(c9@)cg2U&|0<
ColumnDefinition></ColumnDefinition>
'ytO!qm~ x_0</
Grid.ColumnDefinitions>ITPUB个人空间 [ZV TpHD9i!uT/|0F
<
BorderGrid.Row="0"Grid.Column="0"CornerRadius="15"
7\!V(]`.c G0
Width="240"Height="36"
S&R#b un{%[U v'v&g0
Margin="20 0 0 0"HorizontalAlignment="Left">ITPUB个人空间5Wk:\2@2? q3Q {
<
TextBlockText="书籍列表"Foreground="White"ITPUB个人空间4_Ssgvdj.y
HorizontalAlignment="Left"VerticalAlignment="Center"ITPUB个人空间k d(x0QXW9n#Qle'hy
Margin="20 0 0 0"></TextBlock>
/v&{V'KXB0</
Border>
QPcSV2P7B.UT0<
ListBoxx:Name="Books"Grid.Row="1"Margin="40 10 10 10"
8XaXf \F^0
SelectionChanged="Books_SelectionChanged">
%J%A^:[J$X\8u:PC0<
ListBox.ItemTemplate>ITPUB个人空间3A pwVl dV
<
DataTemplate>
'a#yy9W-X ccHH nG0<
StackPanel>
O"D[zPW)f0<
TextBlockText="{BindingName}"Height="32"></TextBlock>ITPUB个人空间 TB/l}1?;z
</
StackPanel>
? R/['vyhg8np0</
DataTemplate>ITPUB个人空间$Lc,w/KTjLVn
</
ListBox.ItemTemplate>
-D([;XQ}0^%S0</
ListBox>ITPUB个人空间 i;i$c9p+g#IK
<
BorderGrid.Row="2"Grid.Column="0"CornerRadius="15"
o(VV)}ve0
Width="240"Height="36"Background="Orange"
F N,h Yy.`u0
Margin="20 0 0 0"HorizontalAlignment="Left">ITPUB个人空间Qd? r d
<
TextBlockx:Name="lblPrice"Text="价格:"Foreground="White"ITPUB个人空间 \AW'K%XO
HorizontalAlignment="Left"VerticalAlignment="Center"ITPUB个人空间:J+A?D'vre
Margin="20 0 0 0"></TextBlock>
b(g [-{fF6UW0</
Border>
a7N,R{y4g%R5e&a0</
Grid>
编写HttpHandler,注意我使用了context.Request.Form["No"],在后面我们将使用WebRequest在RequestReady方法中将数据写入请求流:
public classBookHandler:IHttpHandler
;N:j7Y;H~H:[0
{
LG:?6i ?0public static readonly string[] PriceList =new string[] {ITPUB个人空间?)rcR3e-^nV'x^d
"66.00",
tE&JKA K ~;@0"78.30",
*]}*hu4Q,O!p/D0"56.50",ITPUB个人空间K-B m#i||V
"28.80",ITPUB个人空间4F"Ub7A%si;h
"77.00"ITPUB个人空间ru+Ui6SPz;B o
};ITPUB个人空间5b `r&| E:[
public voidProcessRequest(HttpContextcontext)ITPUB个人空间:aQl qhMI9Y
{ITPUB个人空间z&Z O;M&Hd)_
context.Response.ContentType ="text/plain";
u G,d m3L5r{]&Zu0context.Response.Write(PriceList[Int32.Parse(context.Request.Form["No"])]);ITPUB个人空间v"?_3@K7f
}ITPUB个人空间,Z*^W:n:U

N ?'dl`T0public boolIsReusable
9OS(B2gC[,NH(@0{
"l ux.^-z%K'?0getITPUB个人空间2@omq8e8Wg T
{ITPUB个人空间 qDd|%@tA5t7j
return false;
gW"h$}?'p ~0}
b(x LJk9}0}ITPUB个人空间(qE:d8|2@R
}

在界面加载时绑定书籍列表,关于数据绑定可以参考一步一步学Silverlight 2系列(11):数据绑定

private voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间0_Y/RG{
R9W\
{ITPUB个人空间 X qK"? {| \&pOJT
List<Book> books =newList<Book>() {
)sa+O@5e@v1Xdd0newBook("Professional ASP.NET 3.5"),ITPUB个人空间 } X#]uV3pP
newBook("ASP.NET AJAX In Action"),
1RXW&H \ b5b[0newBook("Silverlight In Action"),ITPUB个人空间:K4K e8Lc vt9T|)_#_G
newBook("ASP.NET 3.5 Unleashed"),
/AXe^rH0newBook("Introducing Microsoft ASP.NET AJAX")
S#H4BU&`9L0};
1|wM W3?nW$YB0
M4C3[&F$|9e0Books.ItemsSource = books;
Q1{N%o aR Z.B7a0}

接下来在SelectionChanged事件中实现用户选择书籍时,我们使用WebRequest提交书籍编号,并且获得价格数据,仍然采用异步模式,提供RequestReady和ResponseReady两个回调函数:

private stringbookNo;ITPUB个人空间,}4TU^%`1ko
ITPUB个人空间 h5r:~#{ T?*]Q
voidBooks_SelectionChanged(objectsender,SelectionChangedEventArgse)
ze QP*ZG0{ITPUB个人空间0C\ Q6w,R4?)u
bookNo = Books.SelectedIndex.ToString();
9PL4\'Te!C0
q1VL*v!A3s9u y2A0Uriendpoint =newUri("http://localhost:49955/BookHandler.ashx");
Q8m-Nd g0ITPUB个人空间7IAU)y)d9k2E
WebRequestrequest =WebRequest.Create(endpoint);ITPUB个人空间s*a'@v(m2z&gQ5i$?w
request.Method ="POST";ITPUB个人空间(j xYk,W/[}:D2r
request.ContentType ="application/x-www-form-urlencoded";
9~0~0Y&i4D to%Yta0request.BeginGetRequestStream(newAsyncCallback(RequestReady), request);
J4N!}~.b.C0m8WzxoD0request.BeginGetResponse(newAsyncCallback(ResponseReady), request);
I?GvC!Fo7` U0}

实现RequestReady方法,将书籍的编号写入请求流中。

voidRequestReady(IAsyncResultasyncResult)
jUA)b u[:XtkW:z0{
#~G'L(Z rG~,p[!in u0WebRequestrequest = asyncResult.AsyncStateasWebRequest;ITPUB个人空间hSx}%k#w4WuH&h
StreamrequestStream = request.EndGetRequestStream(asyncResult);ITPUB个人空间#d${Is8C,G4LR]D

'ZaRP-gh&j Z0using(StreamWriterwriter =newStreamWriter(requestStream))
%?0o8Y'v,H0m?0{ITPUB个人空间 gzo;fA9M4u
writer.Write(String.Format("No={0}", bookNo));ITPUB个人空间5n?Xj4lIxf fM
writer.Flush();ITPUB个人空间 l3t.M$b\.G9T
}ITPUB个人空间W i @7EE ^,Z
}

实现ResponseReady方法,显示返回的结果。

voidResponseReady(IAsyncResultasyncResult)
8I"e-r@ w0VH\l0{
&d?Zy:tNQ0WebRequestrequest = asyncResult.AsyncStateasWebRequest;
u(I f*N }j([0WebResponseresponse = request.EndGetResponse(asyncResult);
*jdmE6t0
y\Lo%R0using(StreamresponseStream = response.GetResponseStream())
!_,Yt1]}8Av0{
o;[PPLJ"s9M0StreamReaderreader =newStreamReader(responseStream);
x }u8b)v}v$o0lblPrice.Text ="价格:"+ reader.ReadToEnd();
gF|R jtC0}ITPUB个人空间?mOIRHdR
}

最后运行的结果如下:

用户选择一本书籍后,将显示其价格:
;myW-D,M$b#pV&Y r O W0
&\xW zG0

结束语

本文简单介绍了在Silverlight 2中如何使用WebRequest提交和获取数据,你可以从这里下载示例程序。

作者:TerryLee
l4I)P7k)_T a K;N7U6s0出处:http://terrylee.cnblogs.com

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

  • 访问量: 665817
  • 日志数: 3733
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2010-12-31

RSS订阅

Open Toolbar