.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提交书籍编号数据,并根据书籍号返回价格信息。最终运行的结果如下图:
r P/M3mYRD H.S0ITPUB个人空间k#Xbw/LM+bF

编写界面布局,XAML如下:

<GridBackground="#46461F">
t7nv5fA elXp Rj0<
Grid.RowDefinitions>ITPUB个人空间E-o$|6qO-@j
<
RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间`7Ka%dl5D;i
<
RowDefinitionHeight="*"></RowDefinition>ITPUB个人空间2@q:xW'e-{?
<
RowDefinitionHeight="40"></RowDefinition>ITPUB个人空间(V!F6xS[ rwJoD
</
Grid.RowDefinitions>ITPUB个人空间-WJ*e'S!zcb
<
Grid.ColumnDefinitions>ITPUB个人空间%];U6Q-R!s~4E:H
<
ColumnDefinition></ColumnDefinition>ITPUB个人空间%A1h | Q JY1{_
</
Grid.ColumnDefinitions>
~'n*x*OSh0<
BorderGrid.Row="0"Grid.Column="0"CornerRadius="15"
7YA6tx9ME7`0RM`8V9G0
Width="240"Height="36"ITPUB个人空间P:A(p+p!c.yey&K
Margin="20 0 0 0"HorizontalAlignment="Left">ITPUB个人空间sv4MPVo.}
<
TextBlockText="书籍列表"Foreground="White"ITPUB个人空间r+d/y:Vx0_]
HorizontalAlignment="Left"VerticalAlignment="Center"ITPUB个人空间h5_&E'E3Wbr8J
Margin="20 0 0 0"></TextBlock>
f*d;Kk.k3{,ob0</
Border>ITPUB个人空间0E]2vcM7OZpxc;{n
<
ListBoxx:Name="Books"Grid.Row="1"Margin="40 10 10 10"ITPUB个人空间;JuVdJ$aXbO ^
SelectionChanged="Books_SelectionChanged">ITPUB个人空间(tm%c*k~:b
<
ListBox.ItemTemplate>ITPUB个人空间:s]j0dzLS
<
DataTemplate>ITPUB个人空间\7A0m/y/u2tG/T`
<
StackPanel>
)OAkP{9E0P0<
TextBlockText="{BindingName}"Height="32"></TextBlock>
CX9O:b6q~df0</
StackPanel>
T.HHGS{we0</
DataTemplate>ITPUB个人空间vBj1`7us9a@b
</
ListBox.ItemTemplate>ITPUB个人空间Q~%L1V1p H_
</
ListBox>ITPUB个人空间M2B,lc.ip6~[
<
BorderGrid.Row="2"Grid.Column="0"CornerRadius="15"ITPUB个人空间_x,D5Nzb-r
Width="240"Height="36"Background="Orange"
:e'c%a8Ay ri3}7v+?0
Margin="20 0 0 0"HorizontalAlignment="Left">
AU;XRI_f(_0I*Y0<
TextBlockx:Name="lblPrice"Text="价格:"Foreground="White"
,rVj.C#y0
HorizontalAlignment="Left"VerticalAlignment="Center"ITPUB个人空间(K-~tHF(| B.Y
Margin="20 0 0 0"></TextBlock>ITPUB个人空间8c#M,}/d5C
</
Border>ITPUB个人空间?i,Z{3I&R
</
Grid>
编写HttpHandler,注意我使用了context.Request.Form["No"],在后面我们将使用WebRequest在RequestReady方法中将数据写入请求流:
public classBookHandler:IHttpHandler
!sjr3L2Z(O?Qj6x0
{ITPUB个人空间 Bo:ZH6E1o.a
public static readonly string[] PriceList =new string[] {
rq j3j6Qo?:Clf0"66.00",
\ P(Z4l;@`1T0"78.30",
B6o/b&T O7T'R1]N0"56.50",ITPUB个人空间 z|IEb*f.d+eM
"28.80",
i y8R#r1}&f8QE0"77.00"ITPUB个人空间y sF N;I"j
};
p u%Oz7\F}4E0C0public voidProcessRequest(HttpContextcontext)ITPUB个人空间:BSJ4wxv/V.v
{
^0zv*JA#Jyv0context.Response.ContentType ="text/plain";ITPUB个人空间y s5} UV:EBt
context.Response.Write(PriceList[Int32.Parse(context.Request.Form["No"])]);
J-Ewf~ U0}
G;c V |Z@M0
Y#A%Z!Uz6th_x0public boolIsReusableITPUB个人空间@5aoedy_
{ITPUB个人空间K({z&o"]C ?v"|2L F
getITPUB个人空间0?bw&`n~:D/N
{
ZD5\d|.l%Aqoi$N5Z0return false;ITPUB个人空间 L+D T7K-~RS
}ITPUB个人空间 b9sVwC h
}ITPUB个人空间u4I2w~q/C
}

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

private voidUserControl_Loaded(objectsender,RoutedEventArgse)ITPUB个人空间k
C*h.Y-^MR.Du%h;r$Z
{ITPUB个人空间4W)Cdx"i)L0E&W7@
List<Book> books =newList<Book>() {
ar5n#D;tf$a)su0newBook("Professional ASP.NET 3.5"),ITPUB个人空间SV,EIm EC}
newBook("ASP.NET AJAX In Action"),
/V0AhI G$V0newBook("Silverlight In Action"),
mw x'sW0newBook("ASP.NET 3.5 Unleashed"),
Yp_zm&uj9Ow F9D0newBook("Introducing Microsoft ASP.NET AJAX")
dP/[3r,A0};ITPUB个人空间 Kk6o B)G
ITPUB个人空间 Rt3]vp"R;O(X
Books.ItemsSource = books;
CS U]m-dr\Db+q0}

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

private stringbookNo;ITPUB个人空间Z%]5`(F(GfV#E
ITPUB个人空间'U?9h#br pX3A N
voidBooks_SelectionChanged(objectsender,SelectionChangedEventArgse)
[Q1A(m};~/s0{ITPUB个人空间 ^EpKe
bookNo = Books.SelectedIndex.ToString();
^3vt#Tp5d0
9E;G-nu$l.J@i;z0Uriendpoint =newUri("http://localhost:49955/BookHandler.ashx");
3@AJnQd.m8Lj'{0ITPUB个人空间D^S4jGuF
WebRequestrequest =WebRequest.Create(endpoint);
V-H^6W P(B+z&IQ0request.Method ="POST";
||J6GEB0request.ContentType ="application/x-www-form-urlencoded";
nr }%l*C {0request.BeginGetRequestStream(newAsyncCallback(RequestReady), request);ITPUB个人空间 ?kcg-Wo \.z MDQ
request.BeginGetResponse(newAsyncCallback(ResponseReady), request);
8SM\;u VtYy0}

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

voidRequestReady(IAsyncResultasyncResult)
Sxt;U2g&t/J0{
JVK S6Bf@0WebRequestrequest = asyncResult.AsyncStateasWebRequest;ITPUB个人空间,at}1hU+uVqp t
StreamrequestStream = request.EndGetRequestStream(asyncResult);ITPUB个人空间6fLmx2Q P
ITPUB个人空间MC*|A)lny
using(StreamWriterwriter =newStreamWriter(requestStream))
@(o$Wvuik%g0{
|&Y1x~_%o,X0writer.Write(String.Format("No={0}", bookNo));
DJ4`/x.ZD*G&t!iQ0writer.Flush();ITPUB个人空间(UQ^(` lFO3Hz
}ITPUB个人空间 Y}U2z6Kb*e0D
}

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

voidResponseReady(IAsyncResultasyncResult)ITPUB个人空间Hvb+{W
{
+@ I;I_%w*K`-e Y0WebRequestrequest = asyncResult.AsyncStateasWebRequest;
0sC,J(]1u Q*D0WebResponseresponse = request.EndGetResponse(asyncResult);
f9o)L t&w2un^j0
H5F#U.cc%Br%rCz0using(StreamresponseStream = response.GetResponseStream())
j#W9}(S2p8oOx f&n+M0{ITPUB个人空间qG$X7L*tl!?7W4I
StreamReaderreader =newStreamReader(responseStream);
S%~/cS0Kl0lblPrice.Text ="价格:"+ reader.ReadToEnd();
N6N twTIL\/~8i7A5]0}ITPUB个人空间 An[ Z,Q"{^.U2G
}

最后运行的结果如下:

用户选择一本书籍后,将显示其价格:ITPUB个人空间.rx~ ?aj},c

dw/_!ADAO0

结束语

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

作者:TerryLee
8V e@(^ ~ V@#s0出处:http://terrylee.cnblogs.com

TAG:

 

评分:0

我来说两句

显示全部

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

日历

« 2008-10-13  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 48410
  • 日志数: 1223
  • 影音数: 7
  • 文件数: 1
  • 建立时间: 2008-01-04
  • 更新时间: 2008-10-13

RSS订阅

Open Toolbar