.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提交书籍编号数据,并根据书籍号返回价格信息。最终运行的结果如下图:
F3o ^7u.B Cs0
:tWy{Y(E0

编写界面布局,XAML如下:

<GridBackground="#46461F">ITPUB个人空间lBz
I+`R7_
<
Grid.RowDefinitions>ITPUB个人空间 jw8SA%eV
<
RowDefinitionHeight="40"></RowDefinition>
B {5q ];sh0<
RowDefinitionHeight="*"></RowDefinition>
5f4B@)J7Go!O;X0<
RowDefinitionHeight="40"></RowDefinition>
y-Nh]"Ms:ja&c-Q0</
Grid.RowDefinitions>
*I*rt0P Zo:v0<
Grid.ColumnDefinitions>ITPUB个人空间I%e'~}(D`%@
<
ColumnDefinition></ColumnDefinition>
B_ be*?0</
Grid.ColumnDefinitions>
ig WV F6j:L2p0<
BorderGrid.Row="0"Grid.Column="0"CornerRadius="15"ITPUB个人空间@5pMb Z,g9P
Width="240"Height="36"
E(G` Io2vOMED0
Margin="20 0 0 0"HorizontalAlignment="Left">
a J,bWj"b!J[0<
TextBlockText="书籍列表"Foreground="White"ITPUB个人空间L e6]6]%D }.@
HorizontalAlignment="Left"VerticalAlignment="Center"ITPUB个人空间Q }awK#Z+P.ha`
Margin="20 0 0 0"></TextBlock>
,n)j%?O~0</
Border>ITPUB个人空间$zf({9N2w z {
<
ListBoxx:Name="Books"Grid.Row="1"Margin="40 10 10 10"ITPUB个人空间3K fI'HDK,p4Y
SelectionChanged="Books_SelectionChanged">ITPUB个人空间 ]$s Y*i;vJ5B-Q:FP
<
ListBox.ItemTemplate>ITPUB个人空间c{{~$z-M
<
DataTemplate>ITPUB个人空间;s/J ~z(xt/p
<
StackPanel>
'Cd3R;W4ZgE0<
TextBlockText="{BindingName}"Height="32"></TextBlock>ITPUB个人空间D!e$`Pt/a
</
StackPanel>ITPUB个人空间1iNS2y`DteVm
</
DataTemplate>
9KZ3H$U0h i)D5m*I0</
ListBox.ItemTemplate>ITPUB个人空间0j D)}3M8R J
</
ListBox>ITPUB个人空间H)Z3] f*Ga
<
BorderGrid.Row="2"Grid.Column="0"CornerRadius="15"ITPUB个人空间}E(uS CF)[
Width="240"Height="36"Background="Orange"ITPUB个人空间 S+O4y6w*p5AO(jn
Margin="20 0 0 0"HorizontalAlignment="Left">
U[4kD|kUl8r0<
TextBlockx:Name="lblPrice"Text="价格:"Foreground="White"
D6{-S8~:h}z Fr0
HorizontalAlignment="Left"VerticalAlignment="Center"ITPUB个人空间 AM/P$c[ }
Margin="20 0 0 0"></TextBlock>
V7PH&Z4IR p0</
Border>
c5ku;B&V}(\2v/L0</
Grid>
编写HttpHandler,注意我使用了context.Request.Form["No"],在后面我们将使用WebRequest在RequestReady方法中将数据写入请求流:
public classBookHandler:IHttpHandler
%DwlIh l,u#j0
{
]GZ4_MKMu1j y0public static readonly string[] PriceList =new string[] {ITPUB个人空间;pd,E9S rJ'Q"D7c+f$W L
"66.00",
@V:bWC| Xn~0"78.30",ITPUB个人空间*o6nWOQ KeZ@.j
"56.50",
S1CTh Y2H/f0"28.80",ITPUB个人空间KdCe(}7x
"77.00"
yYr:RMf0
};
BY k0C_8@j G0public voidProcessRequest(HttpContextcontext)
Oc,{7d c-Y0{
6\(eB'?zId,Z}0context.Response.ContentType ="text/plain";
1F)Y%d~(e0context.Response.Write(PriceList[Int32.Parse(context.Request.Form["No"])]);
%E'X5`qL0}ITPUB个人空间;] ?W^5v^'YR H
ITPUB个人空间)jf0Gc;UM:B;w%F
public boolIsReusableITPUB个人空间)a |YCF^X
{
.jEiYI0getITPUB个人空间IBY q#Km
{
-G/hP ~ ~M0return false;ITPUB个人空间q/T&l LVQ B%k`
}
)n2qerY6T8X0}ITPUB个人空间8zsW%qh
}

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

private voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间gr{Z"ps!g
{
(N)`#B m#E^8S'~0List<Book> books =newList<Book>() {
y%YIs J.I0ng0newBook("Professional ASP.NET 3.5"),
p%R(PP7Da0newBook("ASP.NET AJAX In Action"),ITPUB个人空间_ vImMS%W
newBook("Silverlight In Action"),ITPUB个人空间!?%i^J+tI3m
newBook("ASP.NET 3.5 Unleashed"),
%M(VW2_ sr0newBook("Introducing Microsoft ASP.NET AJAX")
.Jb/U]r}0};ITPUB个人空间|D*\2jk)^$rt

!I A!|1S0t,v0Books.ItemsSource = books;
_!s[-uu_ C0}

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

private stringbookNo;
2{ h)V H!x0
T$k khCLg5Byz-|0voidBooks_SelectionChanged(objectsender,SelectionChangedEventArgse)ITPUB个人空间|B'ci#\y1e o
{
CuYh0l(w.mk([D0bookNo = Books.SelectedIndex.ToString();ITPUB个人空间K sa]-s e.^ad

1Ed'n bf4B { VqVW0Uriendpoint =newUri("http://localhost:49955/BookHandler.ashx");
&U~#V2QbEVbah0ITPUB个人空间.YS8[]7g |
WebRequestrequest =WebRequest.Create(endpoint);ITPUB个人空间(p$S4S]&t5E
request.Method ="POST";
+G#g6KNIXo0request.ContentType ="application/x-www-form-urlencoded";
]2APK!^1t,Z+q4wM0request.BeginGetRequestStream(newAsyncCallback(RequestReady), request);
?D1tCh`6yS0request.BeginGetResponse(newAsyncCallback(ResponseReady), request);ITPUB个人空间_Wb^}1a*A
}

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

voidRequestReady(IAsyncResultasyncResult)ITPUB个人空间%Em?5}7m_
{ITPUB个人空间-R0~f|Rn
WebRequestrequest = asyncResult.AsyncStateasWebRequest;
*b`2i6i$A3o0StreamrequestStream = request.EndGetRequestStream(asyncResult);ITPUB个人空间4Cr2I*F%^*m

p*v3XlS$x |4Nhu0using(StreamWriterwriter =newStreamWriter(requestStream))ITPUB个人空间~&pf Z%@2aHPzfh
{ITPUB个人空间VvQ6m#A$D+V
writer.Write(String.Format("No={0}", bookNo));
8?;z(j#{ Sr[2N)m v0writer.Flush();ITPUB个人空间 @ xG^.B'] D
}ITPUB个人空间'TK*R`^UH
}

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

voidResponseReady(IAsyncResultasyncResult)
[[FM[!r%C0{ITPUB个人空间 `.X*l&wSh w^
WebRequestrequest = asyncResult.AsyncStateasWebRequest;
\;PY'v;K0WebResponseresponse = request.EndGetResponse(asyncResult);ITPUB个人空间[)N&p)HM8Zz)im

lP6`snJY/][ b0using(StreamresponseStream = response.GetResponseStream())
S*{"q@${2dF8] a0{ITPUB个人空间mq5i_G
StreamReaderreader =newStreamReader(responseStream);ITPUB个人空间p"d*TIf)pA$O{
lblPrice.Text ="价格:"+ reader.ReadToEnd();ITPUB个人空间.I*U+A s4Q;TP
}ITPUB个人空间}S%N7r l;z6TY
}

最后运行的结果如下:

用户选择一本书籍后,将显示其价格:ITPUB个人空间,YokjH1ETPr|wl;SX

~Z&B D4on3d w0D1e7Pd-L0

结束语

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

作者:TerryLee
SQP1sB9p3v*_MJ C%P0出处:http://terrylee.cnblogs.com

TAG:

 

评分:0

我来说两句

显示全部

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

Open Toolbar