zoukankan      html  css  js  c++  java
  • silverlight 4数据与通信之WebRequest详解

    此篇博文基于《silverlight4数据与通信之WebClient详解 silverlight4版》,查看请请点击这里

    这里用上一篇文章用过的示例,只不过稍微做一点小的改动,使用 WebRequest 提交书籍编号数据,并根据书籍号返回价格信息。

    <TextBlock x:Name="lblPrice" Text="价格:" Foreground="White"
    HorizontalAlignment
    ="Left" VerticalAlignment="Center"
    Margin
    ="20 0 0 0"></TextBlock>
    </Border>
    </Grid> <Grid.RowDefinitions>
    <RowDefinition Height="40"></RowDefinition>
    <RowDefinition Height="*"></RowDefinition>
    <RowDefinition Height="40"></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
    <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Border Grid.Row="0" Grid.Column="0" CornerRadius="15"
    Width
    ="240" Height="36"
    Margin
    ="20 0 0 0" HorizontalAlignment="Left">
    <TextBlock Text="书籍列表" Foreground="White"
    HorizontalAlignment
    ="Left" VerticalAlignment="Center"
    Margin
    ="20 0 0 0"></TextBlock>
    </Border>
    <ListBox x:Name="Books" Grid.Row="1" Margin="40 10 10 10"
    SelectionChanged
    ="Books_SelectionChanged">
    <ListBox.ItemTemplate>
    <DataTemplate>
    <StackPanel>
    <TextBlock Text="{Binding Name}" Height="32"></TextBlock>
    </StackPanel>
    </DataTemplate>
    </ListBox.ItemTemplate>
    </ListBox>
    <Border Grid.Row="2" Grid.Column="0" CornerRadius="15"
    Width
    ="240" Height="36" Background="Orange"
    Margin
    ="20 0 0 0" HorizontalAlignment="Left"> <Grid Background="#46461F">

    编写 HttpHandler,注意我使用了 context.Request.Form["No"],在后面我们将使用 WebRequest

    在 RequestReady 方法中将数据写入请求流: 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace sample.Web
    {
    /// <summary>
    /// BookHandler2 的摘要说明
    /// </summary>
    public class BookHandler2 : IHttpHandler
    {
    public static readonly string[] PriceList = new string[] {
    "66.00",
    "78.30",
    "56.50",
    "28.80",
    "77.00"
    };

    public void ProcessRequest(HttpContext context)
    {
    context.Response.ContentType
    = "text/plain";
    context.Response.Write(PriceList[Int32.Parse(context.Request.Form[
    "No"])]);
    }

    public bool IsReusable
    {
    get
    {
    return false;
    }
    }
    }
    }

    在界面加载时绑定书籍列表

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
    List
    <BookClass> books = new List<BookClass>()
    {
    new BookClass("Professional ASP.NET 3.5"),
    new BookClass("ASP.NET AJAX In Action"),
    new BookClass("Silverlight In Action"),
    new BookClass("ASP.NET 3.5 Unleashed"),
    new BookClass("Introducing Microsoft ASP.NET AJAX")
    };

    Books.ItemsSource
    = books;
    }

    接下来在 SelectionChanged 事件中实现用户选择书籍时,我们使用 WebRequest 提交书籍编号,并且

    获得价格数据,仍然采用异步模式,提供 RequestReady和 ResponseReady 两个回调函数: 

    private string bookNo;

    private void Books_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    bookNo
    = Books.SelectedIndex.ToString();
    //端口可根据自己的情况随便更改
    Uri endpoint = new Uri(String.Format("http://localhost:80/BookHandler2.ashx"));
    WebRequest request
    = WebRequest.Create(endpoint);
    request.Method
    = "POST";
    request.ContentType
    = "application/x-www-form-urlencoded";
    request.BeginGetRequestStream(
    new AsyncCallback(RequestReady), request);
    // request.BeginGetResponse(new AsyncCallback(ResponseReady), request);
    }

    实现 RequestReady 方法,将书籍的编号写入请求流中。要注意添加System.IO命名空间。 

    void RequestReady(IAsyncResult asyncResult)
    {
    WebRequest request
    = asyncResult.AsyncState as WebRequest;

    Stream requestStream
    = request.EndGetRequestStream(asyncResult);

    using (StreamWriter writer = new StreamWriter(requestStream))
    {
    writer.Write(String.Format(
    "No={0}", bookNo));
    writer.Flush();
    }
    request.BeginGetResponse(
    new AsyncCallback(ResponseReady), request);
    }

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

    void ResponseReady(IAsyncResult asyncResult)
    {
    WebRequest request
    = asyncResult.AsyncState as WebRequest;
    WebResponse response
    = request.EndGetResponse(asyncResult);

    using (Stream responseStream = response.GetResponseStream())
    {
    StreamReader reader
    = new StreamReader(responseStream);
    // lblPrice.Text = "价格:" + reader.ReadToEnd();

    //lblPrice.Dispatcher.BeginInvoke(new UpdatePriceDelegate(UpdatePrice), reader.ReadToEnd());

    //‘charleslau’的方法,可以运行
    string price = reader.ReadToEnd();
    if (this.lblPrice.CheckAccess())
    {
    this.lblPrice.Text = "价格:" + price;
    }
    else
    {
    this.Dispatcher.BeginInvoke(new UIContextChangedEventHandler(UIContextChanged), price);
    }
    }
    }
    public delegate void UIContextChangedEventHandler(object state);

    private void UIContextChanged(object state)
    {
    this.lblPrice.Text = "价格:" + (String)state;
    }

    至此,大功告成,可以访问了,效果参见上一篇博文,文中有很多注释的地方,那是我参考的实例是silverlight2beta版测试通过的,在silverlight4中有些许不同,我已经做了修改,代码测试可以通过。下面附加后台完整代码

    完整后台代码
    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;

    namespace sample
    {
    public partial class s13 : UserControl
    {
    public s13()
    {
    InitializeComponent();
    }

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
    List
    <BookClass> books = new List<BookClass>()
    {
    new BookClass("Professional ASP.NET 3.5"),
    new BookClass("ASP.NET AJAX In Action"),
    new BookClass("Silverlight In Action"),
    new BookClass("ASP.NET 3.5 Unleashed"),
    new BookClass("Introducing Microsoft ASP.NET AJAX")
    };

    Books.ItemsSource
    = books;
    }
    private string bookNo;

    private void Books_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    bookNo
    = Books.SelectedIndex.ToString();
    //端口可根据自己的情况随便更改
    Uri endpoint = new Uri(String.Format("http://localhost:80/BookHandler2.ashx"));
    WebRequest request
    = WebRequest.Create(endpoint);
    request.Method
    = "POST";
    request.ContentType
    = "application/x-www-form-urlencoded";
    request.BeginGetRequestStream(
    new AsyncCallback(RequestReady), request);
    // request.BeginGetResponse(new AsyncCallback(ResponseReady), request);
    }

    void RequestReady(IAsyncResult asyncResult)
    {
    WebRequest request
    = asyncResult.AsyncState as WebRequest;

    Stream requestStream
    = request.EndGetRequestStream(asyncResult);

    using (StreamWriter writer = new StreamWriter(requestStream))
    {
    writer.Write(String.Format(
    "No={0}", bookNo));
    writer.Flush();
    }
    request.BeginGetResponse(
    new AsyncCallback(ResponseReady), request);
    }

    void ResponseReady(IAsyncResult asyncResult)
    {
    WebRequest request
    = asyncResult.AsyncState as WebRequest;
    WebResponse response
    = request.EndGetResponse(asyncResult);

    using (Stream responseStream = response.GetResponseStream())
    {
    StreamReader reader
    = new StreamReader(responseStream);
    // lblPrice.Text = "价格:" + reader.ReadToEnd();

    //lblPrice.Dispatcher.BeginInvoke(new UpdatePriceDelegate(UpdatePrice), reader.ReadToEnd());

    //‘charleslau’的方法,可以运行
    string price = reader.ReadToEnd();
    if (this.lblPrice.CheckAccess())
    {
    this.lblPrice.Text = "价格:" + price;
    }
    else
    {
    this.Dispatcher.BeginInvoke(new UIContextChangedEventHandler(UIContextChanged), price);
    }
    }
    }
    public delegate void UIContextChangedEventHandler(object state);

    private void UIContextChanged(object state)
    {
    this.lblPrice.Text = "价格:" + (String)state;
    }


    //private void UpdatePrice(string price)
    //{
    // lblPrice.Text = "price:" + price;
    //}
    //private delegate void UpdatePriceDelegate(string price);
    }
    }

    参考资料:http://www.cnblogs.com/Terrylee/archive/2008/03/09/silverlight2-step-by-step-part13-data-and-communication-webrequest.html

    感谢李老师和回帖的前辈,我对数据通信知之甚少,如有纰漏,敬请指出

  • 相关阅读:
    搭建Nginx反向代理做内网域名转发
    网站监测脚本
    Nginx启动脚本
    L2TP用户添加和删除、搜索脚本
    CentOS Linux 安装IPSec+L2TP
    Nginx认证
    Nginx配置HTTPS
    Nginx 如何处理一个请求
    HTTP协议原理
    DNS解析流程
  • 原文地址:https://www.cnblogs.com/junyuz/p/1938040.html
Copyright © 2011-2022 走看看