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

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

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第4章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第3章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第1,2章 读书笔记(待更新)
    Tkinter的Message组件
    Git 实操/配置/实践
    mysq5.7.32-win安装步骤
    行为型模式之模板方法
    结构型模式之组合模式
    结构型模式之享元模式
    结构型模式之外观模式
  • 原文地址:https://www.cnblogs.com/junyuz/p/1938040.html
Copyright © 2011-2022 走看看