silverlight: http请求的GET及POST示例

http请求的get/post并不是难事,只是silverlight中一切皆是异步,所以代码看起来就显得有些冗长了,下面这个HttpHelper是在总结 园友 的基础上,修改得来:

 1 namespace SLAwb.Helper
 2 {
 3     public sealed class MediaType
 4     {
 5         /// <summary>
 6         /// "application/xml"
 7         /// </summary>
 8         public const string APPLICATION_XML = "application/xml";
 9 
10         /// <summary>
11         /// application/json
12         /// </summary>
13         public const string APPLICATION_JSON = "application/json";
14 
15         /// <summary>
16         /// "application/x-www-form-urlencoded"
17         /// </summary>
18         public const string APPLICATION_FORM_URLENCODED = "application/x-www-form-urlencoded";
19      
20     }
21 }
View Code
 1 using System;
 2 using System.IO;
 3 using System.Net;
 4 using System.Threading;
 5 
 6 namespace SLAwb.Helper
 7 {
 8     /// <summary>
 9     /// Http工具类,用于向指定url发起Get或Post请求
10     /// http://yjmyzz.cnblogs.com/
11     /// </summary>
12     public class HttpHelper
13     {
14         private string postData;
15         SynchronizationContext currentContext;
16         SendOrPostCallback sendOrPostCallback;
17 
18         /// <summary>
19         /// 从指定url以Get方式获取数据
20         /// </summary>
21         /// <param name="url"></param>
22         /// <param name="completedHandler"></param>
23         public void Get(string url, DownloadStringCompletedEventHandler completedHandler)
24         {
25             WebClient client = new WebClient();
26             client.DownloadStringCompleted += completedHandler;
27             client.DownloadStringAsync(new Uri(url));
28         }
29 
30 
31 
32         /// <summary>
33         /// 向指定url地址Post数据
34         /// </summary>
35         /// <param name="url"></param>
36         /// <param name="data"></param>
37         /// <param name="mediaType"></param>
38         /// <param name="synchronizationContext"></param>
39         /// <param name="callBack"></param>
40         public void Post(string url, string data, string mediaType, SynchronizationContext synchronizationContext, SendOrPostCallback callBack)
41         {
42             currentContext = synchronizationContext;
43             Uri endpoint = new Uri(url);
44             sendOrPostCallback = callBack;
45             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endpoint);
46             request.Method = "POST";
47             request.ContentType = mediaType;
48             postData = data;
49             request.BeginGetRequestStream(new AsyncCallback(RequestReadySocket), request);
50         }
51 
52         private void RequestReadySocket(IAsyncResult asyncResult)
53         {
54             WebRequest request = asyncResult.AsyncState as WebRequest;
55             Stream requestStream = request.EndGetRequestStream(asyncResult);
56 
57             using (StreamWriter writer = new StreamWriter(requestStream))
58             {
59                 writer.Write(postData);
60                 writer.Flush();
61             }
62 
63             request.BeginGetResponse(new AsyncCallback(ResponseReadySocket), request);
64         }
65 
66         private void ResponseReadySocket(IAsyncResult asyncResult)
67         {
68             try
69             {
70                 WebRequest request = asyncResult.AsyncState as WebRequest;
71                 WebResponse response = request.EndGetResponse(asyncResult);
72                 using (Stream responseStream = response.GetResponseStream())
73                 {
74                     StreamReader reader = new StreamReader(responseStream);
75                     string paramStr = reader.ReadToEnd();
76                     currentContext.Post(sendOrPostCallback, paramStr);
77                 }
78             }
79             catch (Exception e)
80             {
81                 currentContext.Post(sendOrPostCallback, e.Message); 
82             }
83             
84         }
85 
86 
87     }
88 }
View Code

Silverlight中的测试代码:
xaml部分

 1 <UserControl x:Class="SLAwb.MainPage"
 2     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6     mc:Ignorable="d"
 7     d:DesignHeight="480" d:DesignWidth="640">
 8 
 9     <Grid x:Name="LayoutRoot" Background="White">
10         <Grid.RowDefinitions>
11             <RowDefinition Height="30"></RowDefinition>
12             <RowDefinition Height="*"></RowDefinition>
13             <RowDefinition Height="2*"></RowDefinition>
14         </Grid.RowDefinitions>        
15         <Grid Grid.Row="0" Margin="3">
16             <Grid.ColumnDefinitions>
17                 <ColumnDefinition Width="40"></ColumnDefinition>
18                 <ColumnDefinition Width="*"></ColumnDefinition>
19                 <ColumnDefinition Width="75"></ColumnDefinition>
20                 <ColumnDefinition Width="95"></ColumnDefinition>
21                 <ColumnDefinition Width="80"></ColumnDefinition>
22                 <ColumnDefinition Width="80"></ColumnDefinition>
23             </Grid.ColumnDefinitions>
24             <TextBlock VerticalAlignment="Center" TextAlignment="Right">地址:</TextBlock>
25             <TextBox Name="txtUrl" Grid.Column="1" Text="http://localhost/"></TextBox>
26             <TextBlock Grid.Column="2" VerticalAlignment="Center" TextAlignment="Right">MediaType:</TextBlock>
27             <TextBox Name="txtMediaType" Grid.Column="3" Text="application/xml"></TextBox>
28             <Button Name="btnPost" Content="Post" Grid.Column="4" Margin="3,1" Click="btnPost_Click"></Button>
29             <Button Name="btnGet" Content="Get" Grid.Column="5" Margin="3,1" Click="btnGet_Click"></Button>
30         </Grid>
31         
32         <Grid Grid.Row="1">
33             <Grid.ColumnDefinitions>
34                 <ColumnDefinition Width="40"></ColumnDefinition>
35                 <ColumnDefinition Width="*"></ColumnDefinition>
36             </Grid.ColumnDefinitions>
37             <TextBlock VerticalAlignment="Top" TextAlignment="Right">数据:</TextBlock>
38             <TextBox Name="txtPostData" Grid.Column="1" Margin="3" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"></TextBox>
39         </Grid>
40 
41         <Grid Grid.Row="2">
42             <Grid.ColumnDefinitions>
43                 <ColumnDefinition Width="40"></ColumnDefinition>
44                 <ColumnDefinition Width="*"></ColumnDefinition>
45             </Grid.ColumnDefinitions>
46             <TextBlock VerticalAlignment="Top" TextAlignment="Right">返回:</TextBlock>
47             <TextBox Name="txtResult" Grid.Column="1" Margin="3" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"></TextBox>
48         </Grid>
49     </Grid>
50 </UserControl>
View Code

cs部分

 1 using SLAwb.Helper;
 2 using System;
 3 using System.Net;
 4 using System.Threading;
 5 using System.Windows;
 6 using System.Windows.Controls;
 7 
 8 namespace SLAwb
 9 {
10     public partial class MainPage : UserControl
11     {
12         private SynchronizationContext currentContext;
13 
14 
15         public MainPage()
16         {
17             InitializeComponent();
18             this.currentContext = SynchronizationContext.Current;
19         }
20 
21         private void btnPost_Click(object sender, RoutedEventArgs e)
22         {
23             BeforeReturn();
24             HttpHelper httpHelper = new HttpHelper();
25             httpHelper.Post(txtUrl.Text, txtPostData.Text, txtMediaType.Text, currentContext, PostCompletedHandler);
26         }
27 
28         private void PostCompletedHandler(Object obj)
29         {
30             txtResult.Text = obj.ToString();
31         }
32 
33         private void btnGet_Click(object sender, RoutedEventArgs e)
34         {
35             BeforeReturn();
36             HttpHelper httpHelper = new HttpHelper();
37             httpHelper.Get(txtUrl.Text, GetCompletedHandler);            
38         }
39 
40 
41         void BeforeReturn() {
42             txtResult.Text = "loading...";
43         }
44 
45 
46         void GetCompletedHandler(object sender, DownloadStringCompletedEventArgs e)
47         {
48             if (e.Error == null)
49             {
50                 txtResult.Text = e.Result;
51             }
52             else
53             {
54                 txtResult.Text = e.Error.Message;
55             }
56         }
57     }
58 }
View Code

 

posted @ 2014-12-25 22:45  菩提树下的杨过  阅读(2555)  评论(3编辑  收藏  举报