`

Silverlight HttpWebRequest工具类

阅读更多

原文地址:http://www.cameronalbert.com/post/2008/03/HttpWebRequest-Helper-for-Silverlight-2.aspx

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Net;

namespace Lionsguard
{
    public class HttpHelper
    {
        private HttpWebRequest Request { get; set; }
        public Dictionary<string, string> PostValues { get; private set; }

        public event HttpResponseCompleteEventHandler ResponseComplete;
        private void OnResponseComplete(HttpResponseCompleteEventArgs e)
        {
            if (this.ResponseComplete != null)
            {
                this.ResponseComplete(e);
            }
        }

        public HttpHelper(Uri requestUri, string method, params KeyValuePair<string, string>[] postValues)
        {
            this.Request = (HttpWebRequest)WebRequest.Create(requestUri);
            this.Request.ContentType = "application/x-www-form-urlencoded";
            this.Request.Method = method;
            this.PostValues = new Dictionary<string, string>();
            if (postValues != null && postValues.Length > 0)
            {
                foreach (var item in postValues)
                {
                    this.PostValues.Add(item.Key, item.Value);
                }
            }
        }

        public void Execute()
        {
            this.Request.BeginGetRequestStream(new AsyncCallback(HttpHelper.BeginRequest), this);
        }

        private static void BeginRequest(IAsyncResult ar)
        {
            HttpHelper helper = ar.AsyncState as HttpHelper;
            if (helper != null)
            {
                if (helper.PostValues.Count > 0)
                {
                    using (StreamWriter writer = new StreamWriter(helper.Request.EndGetRequestStream(ar)))
                    {
                        foreach (var item in helper.PostValues)
                        {
                            writer.Write("{0}={1}&", item.Key, HttpUtility.UrlEncode(item.Value));
                        }
                    }
                }
                helper.Request.BeginGetResponse(new AsyncCallback(HttpHelper.BeginResponse), helper);
            }
        }

        private static void BeginResponse(IAsyncResult ar)
        {
            HttpHelper helper = ar.AsyncState as HttpHelper;
            if (helper != null)
            {
                HttpWebResponse response = (HttpWebResponse)helper.Request.EndGetResponse(ar);
                if (response != null)
                {
                    Stream stream = response.GetResponseStream();
                    if (stream != null)
                    {
                        using (StreamReader reader = new StreamReader(stream))
                        {
                            helper.OnResponseComplete(new HttpResponseCompleteEventArgs(reader.ReadToEnd()));
                        }
                    }
                }
            }
        }
    }

    public delegate void HttpResponseCompleteEventHandler(HttpResponseCompleteEventArgs e);
    public class HttpResponseCompleteEventArgs : EventArgs
    {
        public string Response { get; set; }

        public HttpResponseCompleteEventArgs(string response)
        {
            this.Response = response;
        }
    }
}

 使用方法

 

        private void ProcessCommand(short cmd, string msg)
        {
            App app = App.Current as App;
            HttpHelper helper = new HttpHelper(app.ServerUri, "POST", 
                new KeyValuePair<string, string>("authKey", app.AuthKey),
                new KeyValuePair<string, string>("cmd", cmd.ToString()),
                new KeyValuePair<string, string>("msg", msg));
            helper.ResponseComplete += new HttpResponseCompleteEventHandler(this.CommandComplete);
            helper.Execute();

        }

        private void CommandComplete(HttpResponseCompleteEventArgs e)
        {
            txtAlert.Text = e.Response;
        }

 

如果您使用的是VBScript的话,工具类代码如下:

Public Class HttpHelper

    Private Property Request() As HttpWebRequest
        Get
            Return _Request
        End Get
        Set(ByVal value As HttpWebRequest)
            _Request = value
        End Set
    End Property
    Private _Request As HttpWebRequest

    Public Property PostValues() As Dictionary(Of String, String)
        Get
            Return _PostValues
        End Get
        Private Set(ByVal value As Dictionary(Of String, String))
            _PostValues = value
        End Set
    End Property
    Private _PostValues As Dictionary(Of String, String)

    Public Event ResponseComplete As HttpResponseCompleteEventHandler
    Private Sub OnResponseComplete(ByVal e As HttpResponseCompleteEventArgs)
        RaiseEvent ResponseComplete(e)
    End Sub

    Public Sub New(ByVal requestUri As Uri, ByVal method As String, ByVal ParamArray postValues As KeyValuePair(Of String, String)())
        Me.Request = DirectCast(WebRequest.Create(requestUri), HttpWebRequest)
        Me.Request.ContentType = "application/x-www-form-urlencoded"
        Me.Request.Method = method
        Me.PostValues = New Dictionary(Of String, String)()
        For Each item In postValues
            Me.PostValues.Add(item.Key, item.Value)
        Next
    End Sub

    Public Sub Execute()
        Me.Request.BeginGetRequestStream(New AsyncCallback(AddressOf HttpHelper.BeginRequest), Me)
    End Sub

    Private Shared Sub BeginRequest(ByVal ar As IAsyncResult)
        Dim helper As HttpHelper = TryCast(ar.AsyncState, HttpHelper)
        If helper IsNot Nothing Then
            Using writer As New StreamWriter(helper.Request.EndGetRequestStream(ar))
                For Each item In helper.PostValues
                    writer.Write("{0}={1}&", item.Key, HttpUtility.UrlEncode(item.Value))
                Next
            End Using
            helper.Request.BeginGetResponse(New AsyncCallback(AddressOf HttpHelper.BeginResponse), helper)
        End If
    End Sub

    Private Shared Sub BeginResponse(ByVal ar As IAsyncResult)
        Dim helper As HttpHelper = TryCast(ar.AsyncState, HttpHelper)
        If helper IsNot Nothing Then
            Dim response As HttpWebResponse = DirectCast(helper.Request.EndGetResponse(ar), HttpWebResponse)
            If response IsNot Nothing Then
                Dim stream As Stream = response.GetResponseStream()
                If stream IsNot Nothing Then
                    Using reader As New StreamReader(stream)
                        helper.OnResponseComplete(New HttpResponseCompleteEventArgs(reader.ReadToEnd()))
                    End Using
                End If
            End If
        End If
    End Sub
End Class

Public Delegate Sub HttpResponseCompleteEventHandler(ByVal e As HttpResponseCompleteEventArgs)

Public Class HttpResponseCompleteEventArgs
    Inherits EventArgs

    Public Property Response() As String
        Get
            Return _Response
        End Get
        Set(ByVal value As String)
            _Response = value
        End Set
    End Property
    Private _Response As String

    Public Sub New(ByVal response As String)
        Me.Response = response
    End Sub

End Class

 

   在做自动更新程序时想省点事,直接使用HttpWebRequest和HttpWebResponse从服务器上下载更新的文件。 使用时注意Close响应流:
  使用HttpWebRequest.GetResponse()取得HttpWebResponse接口后,必须要记得调用HttpWebResponse.close关闭流
  如果使用HttpWebResponse.GetResponseStream()取得响应流的话,那么使用此Stream的Close方法来关闭也是一样。
  如果是使用StreamReader.ReadToEnd()从响应流中读取文本,则在读取完内容后会自动关闭流
  MSDN中这样描述HttpWebResponse.close方法:
  Close 方法关闭响应流并释放到资源的连接以供其他请求重用。
  您必须调用 Stream.Close 或 HttpWebResponse.Close 方法来关闭流并释放连接以供重用。不必同时调用 Stream.Close 和 HttpWebResponse.Close,但这样做不会导致错误。关闭该流失败会导致应用程序用尽连接。
  连接限制好像是最大2个,不知是IIS的限制还是本地HttpWebRequest的限制。 

分享到:
评论

相关推荐

    (14)silverlight网络通信与开发示例

    - **基本的HTTP GET/POST请求**:创建一个简单的Silverlight应用,利用`WebClient`类发送HTTP请求获取远程资源,或者使用`HttpWebRequest`类构造更复杂的POST请求。 - **WCF服务调用示例**:创建一个WCF服务,提供...

    Silverlight 4 API 文档

    - **网络和数据访问**:WebClient、HttpWebRequest类用于网络通信,以及XMLHttpRequest进行异步数据请求。 - **本地存储和OOB功能**:IsolatedStorage提供本地数据存储,OOB功能支持权限和桌面图标设置。 - **安全...

    Silverlight基础学习文档

    1. 前后端通信:通过HttpWebRequest、WebClient类进行异步请求,或者使用WCF(Windows Communication Foundation)服务进行更复杂的数据交换。 2. Out-of-Browser体验:Silverlight可以作为桌面应用运行,允许离线...

    silverlight操作XML

    总之,虽然Silverlight在操作服务器上的XML文件时存在一定的限制,但通过合理的数据交换策略和使用提供的XML处理工具,仍然可以有效地处理XML数据。了解和掌握这些技巧对于开发高效且用户友好的Silverlight应用程序...

    Silverlight.4 2010 教程

    通过HttpWebRequest、WebClient类,开发者可以轻松地与服务器进行数据交换。同时,WCF RIA Services的使用使得前后端数据交互变得更加简单和安全。 最后,本书可能还会讨论一些高级主题,如Out-of-Browser(OOB)...

    Silverlight同步通信

    在Silverlight中,同步通信主要依赖于`WebClient`或`HttpWebRequest`类。这两个类提供了发送HTTP请求并获取响应的方法,如`WebClient.DownloadString()`和`HttpWebRequest.GetResponse()`。 ### 3. 使用WebClient...

    silverlight源码

    7. **Silverlight开发工具** - **Visual Studio**: 微软提供的集成开发环境,用于编写Silverlight应用程序。 - **Expression Blend**: 设计师友好的工具,用于创建和编辑XAML UI。 8. **Silverlight与WCF** - **...

    Silverlight 银光 教程

    4. **C#编程**:由于Silverlight通常与C#一起使用,所以教程会涵盖C#的基础知识,如变量、控制流、类和对象,以及如何在Silverlight项目中使用C#编写业务逻辑。 5. **UI设计**:讲解如何使用 Blend 或 Visual ...

    Silverlight模仿Google的自定义桌面.zip

    考虑到Google桌面可能需要从服务器获取数据或更新,Silverlight支持异步网络通信,如使用HttpWebRequest类进行HTTP请求,或者使用WebClient类简化数据交换。 8. **多媒体支持** Silverlight可以播放音频和视频,...

    Silverlight 4 Unleashed sample code

    总之,《Silverlight 4 Unleashed》的样本代码集是开发者学习和掌握Silverlight 4的强大工具,从基础到高级,从数据访问到用户交互,再到动画和应用程序架构,都包含在内。通过深入研究这些代码,开发者可以更好地...

    Silverlight 加载进度实例讲解

    在Silverlight中,可以通过HttpWebRequest或WebClient类来获取上传或下载的进度信息。 5. **用户体验优化**:除了实际的进度显示,还可以通过动画效果增强用户体验。例如,可以使用故事板和关键帧动画使进度条有...

    silverlight 4.0 上传图片到web下教材 原码

    开发过程中,使用Silverlight的调试工具(如Visual Studio的Silverlight调试器)进行测试和调试至关重要。检查错误消息、断点调试和性能分析能帮助优化代码。 总的来说,Silverlight 4.0提供了一套完整的解决方案...

    arcgis api for silverlight跨域文件

    客户端则可能需要利用Silverlight的HttpWebRequest或WebClient类,通过设置适当的请求头来发起跨域请求。 在使用ArcGIS API for Silverlight进行跨域操作时,有以下几点需要注意: 1. **配置服务端**:确保ArcGIS ...

    silverlight 使用的代码段

    导入过程通常包括定位到代码段文件,然后通过Visual Studio的“工具”&gt;“代码段管理器”进行安装和管理。 总结来说,Silverlight代码段是提升开发效率的利器,它们提供了快捷的方式来创建和组织复杂的Silverlight...

    silverlight使用大全

    - 配置开发环境,包括安装Visual Studio和Silverlight开发工具。 2. **基础概念** - XAML(Extensible Application Markup Language):用于描述Silverlight用户界面的主要标记语言,它的语法和结构。 - 控件库...

    Silverlight摄像头拍照并上传,支持截取部分视频画面(源代码)

    6. **Visual Studio 2010**:作为开发环境,Visual Studio 2010提供了一整套工具和框架支持,包括Silverlight项目模板,调试器,以及代码编辑器等,方便开发者构建和测试应用程序。 7. **用户体验**:在实现以上...

    silverlight 4多文件上传实例

    在Silverlight 4中,可以使用`System.IO.Packaging.Package`类来读取和写入文件内容,配合`System.Net.HttpWebRequest`或`System.Threading.Tasks.Task`进行异步网络通信。每个文件的上传都应作为一个单独的任务来...

    5Silverlight访问数据库之Access数据库[参照].pdf

    然而,Visual Studio 并未直接提供 Silverlight 与 Access 互操作的工具。本篇将探讨如何让 Silverlight 应用程序利用 Access 数据库作为后端数据存储。 首先,我们需要进行一些准备工作。创建一个测试项目,包括...

    SL4_UploadingMultipleFiles

    Silverlight 4是Silverlight技术的第四个主要版本,它提供了一套丰富的开发工具和技术,用于创建具有丰富媒体体验和交互性功能的Web应用。它支持多种语言如C#、VB.NET,以及XAML(Extensible Application Markup ...

Global site tag (gtag.js) - Google Analytics