微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

上接稳扎稳打Silverlight(20) - 2.0通信之WebClient, 以字符串的形式上传/下载数据

@H_502_6@2、以字符串的形式和流的形式上传数据@H_502[email protected](WCF创建的用于演示以字符串的形式和流的形式上传数据的REST服务)

using System; @H_502_6@

using System.Linq; @H_502_6@

using System.Runtime.Serialization; @H_502_6@

using System.ServiceModel; @H_502_6@

using System.ServiceModel.Activation; @H_502_6@

@H_502_6@

using System.ServiceModel.Web; @H_502_6@

using System.Collections.Generic; @H_502_6@

using System.Text; @H_502_6@

using System.IO; @H_502_6@

@H_502_6@/// <summary> @H_502_6@/// 提供 REST 服务的类 @H_502_6@/// 注:Silverlight只支持 GET 和 POST @H_502_6@/// </summary> @H_502_6@

[ServiceContract] @H_502_6@

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] @H_502_6@

public class REST @H_502_6@

{ @H_502_6@

         /// <summary> @H_502_6@

         /// 用于演示返回 JSON(对象) 的 REST 服务 @H_502_6@

         /// </summary> @H_502_6@

         /// <param name="name"></param> @H_502_6@

         /// <returns></returns> @H_502_6@

        [OperationContract] @H_502_6@

        [WebGet(UriTemplate = "User/{name}/json",ResponseFormat = Webmessageformat.Json)] @H_502_6@

         public User HelloJson( string name) @H_502_6@

        { @H_502_6@

                 return new User { Name = name,DayOfBirth = new DateTime(1980,2,14) }; @H_502_6@

        } @H_502_6@

@H_502_6@

         /// <summary> @H_502_6@

         /// 用于演示返回 JSON(集合) 的 REST 服务 @H_502_6@

         /// </summary> @H_502_6@

         /// <returns></returns> @H_502_6@

        [OperationContract] @H_502_6@

        [WebGet(UriTemplate = "Users/json",ResponseFormat = Webmessageformat.Json)] @H_502_6@

         public List<User> HelloJson2() @H_502_6@

        { @H_502_6@

                 return new List<User>     @H_502_6@

                {     @H_502_6@

                         new User(){ Name = "webabcd01",1,1) },@H_502_6@

                         new User(){ Name = "webabcd02",2) },@H_502_6@

                         new User(){ Name = "webabcd03",3,3) },@H_502_6@

                }; @H_502_6@

        } @H_502_6@

@H_502_6@

         /// <summary> @H_502_6@

         /// 用于演示返回 XML(对象) 的 REST 服务 @H_502_6@

         /// </summary> @H_502_6@

         /// <param name="name"></param> @H_502_6@

         /// <returns></returns> @H_502_6@

        [OperationContract] @H_502_6@

        [WebGet(UriTemplate = "User/{name}/xml",ResponseFormat = Webmessageformat.Xml)] @H_502_6@

         public User HelloXml( string name) @H_502_6@

        { @H_502_6@

                 return new User { Name = name,14) }; @H_502_6@

        } @H_502_6@

@H_502_6@

         /// <summary> @H_502_6@

         /// 用于演示返回 XML(集合) 的 REST 服务 @H_502_6@

         /// </summary> @H_502_6@

         /// <returns></returns> @H_502_6@

        [OperationContract] @H_502_6@

        [WebGet(UriTemplate = "Users/xml",ResponseFormat = Webmessageformat.Xml)] @H_502_6@

         public List<User> HelloXml2() @H_502_6@

        { @H_502_6@

                 return new List<User>     @H_502_6@

                {     @H_502_6@

                         new User(){ Name = "webabcd01",@H_502_6@

                }; @H_502_6@

        } @H_502_6@

@H_502_6@

         /// <summary> @H_502_6@

         /// 用于演示以字符串的形式上传数据的 REST 服务 @H_502_6@

         /// </summary> @H_502_6@

         /// <param name="fileName">上传文件</param> @H_502_6@

         /// <param name="stream">POST 过来的数据</param> @H_502_6@

         /// <returns></returns> @H_502_6@

        [OperationContract] @H_502_6@

        [WebInvoke(UriTemplate = "UploadString/?fileName={fileName}",Method = "POST",ResponseFormat = Webmessageformat.Json)] @H_502_6@

         public bool UploadString( string fileName,Stream stream) @H_502_6@

        { @H_502_6@

                 // 文件的服务端保存路径 @H_502_6@

                 string path = Path.Combine("C:\\",fileName); @H_502_6@

@H_502_6@

                 try @H_502_6@

                { @H_502_6@

                         using (StreamReader sr = new StreamReader(stream)) @H_502_6@

                        { @H_502_6@

                                 // 将 POST 过来的被 Base64 编码过字符串传换成 byte[] @H_502_6@

                                 byte[] buffer = Convert.FromBase64String(sr.ReadToEnd()); @H_502_6@

@H_502_6@

                                 using (FileStream fs = new FileStream(path,FileMode.Create,FileAccess.Write,FileShare.None)) @H_502_6@

                                { @H_502_6@

                                         // 将文件写入到服务端 @H_502_6@

                                        fs.Write(buffer,buffer.Length); @H_502_6@

                                } @H_502_6@

                        } @H_502_6@

@H_502_6@

                         return true; @H_502_6@

                } @H_502_6@

                 catch @H_502_6@

                { @H_502_6@

                         return false; @H_502_6@

                } @H_502_6@

        } @H_502_6@

@H_502_6@

         /// <summary> @H_502_6@

         /// 用于演示以流的形式上传数据的 REST 服务 @H_502_6@

         /// </summary> @H_502_6@

         /// <param name="fileName">上传文件</param> @H_502_6@

         /// <param name="stream">POST 过来的数据(流的方式)</param> @H_502_6@

         /// <returns></returns> @H_502_6@

        [OperationContract] @H_502_6@

        [WebInvoke(UriTemplate = "UploadStream/?fileName={fileName}",ResponseFormat = Webmessageformat.Json)] @H_502_6@

         public bool UploadStream( string fileName,fileName); @H_502_6@

@H_502_6@

                 try @H_502_6@

                { @H_502_6@

                         using (FileStream fs = new FileStream(path,FileShare.None)) @H_502_6@

                        { @H_502_6@

                                 byte[] buffer = new byte[4096]; @H_502_6@

                                 int count = 0; @H_502_6@

@H_502_6@

                                 // 每 POST 过来 4096 字节的数据,往服务端写一次 @H_502_6@

                                 while ((count = stream.Read(buffer,buffer.Length)) > 0) @H_502_6@

                                { @H_502_6@

                                        fs.Write(buffer,count); @H_502_6@

                                } @H_502_6@

                        } @H_502_6@

@H_502_6@

                         return true; @H_502_6@

                } @H_502_6@

                 catch @H_502_6@

                { @H_502_6@

                         return false; @H_502_6@

                } @H_502_6@

        } @H_502_6@

}
 
WebClientUpload.xaml
<UserControl x:Class="Silverlight20.Communication.WebClientUpload" @H_502_6@        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     @H_502_6@        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> @H_502_6@        <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">             @H_502_6@             @H_502_6@                <StackPanel Margin="5" Width="200"> @H_502_6@                        <TextBox x:Name="lblMsgString" Margin="5" /> @H_502_6@                        <ProgressBar x:Name="progressBarString" Height="20" Margin="5" Minimum="0" Maximum="100" /> @H_502_6@                        <Button x:Name="btnString" Content="上传文件(字符串的方式)" Margin="5" Click="btnString_Click" /> @H_502_6@                </StackPanel> @H_502_6@                 @H_502_6@                <StackPanel Margin="5" Width="200"> @H_502_6@                        <TextBox x:Name="lblMsgStream" Margin="5" /> @H_502_6@                        <ProgressBar x:Name="progressBarStream" Height="20" Margin="5" Minimum="0" Maximum="100" /> @H_502_6@                        <Button x:Name="btnStream" Content="上传文件(流的方式)" Margin="5" Click="btnStream_Click" /> @H_502_6@                </StackPanel> @H_502_6@                 @H_502_6@        </StackPanel> @H_502_6@</UserControl>
 
WebClientUpload.xaml.cs

using System; @H_502_6@

using System.Collections.Generic; @H_502_6@

using System.Linq; @H_502_6@

using System.Net; @H_502_6@

using System.Windows; @H_502_6@

using System.Windows.Controls; @H_502_6@

using System.Windows.Documents; @H_502_6@

using System.Windows.Input; @H_502_6@

using System.Windows.Media; @H_502_6@

using System.Windows.Media.Animation; @H_502_6@

using System.Windows.Shapes; @H_502_6@

@H_502_6@

using System.IO; @H_502_6@

using System.Windows.Resources; @H_502_6@

using System.ComponentModel; @H_502_6@

using System.Windows.browser; @H_502_6@

@H_502_6@

namespace Silverlight20.Communication @H_502_6@

{ @H_502_6@

         public partial class WebClientUpload : UserControl @H_502_6@

        { @H_502_6@

                 // 用于演示以字符串的形式上传数据 @H_502_6@

                 string _urlString = "http://localhost:3036/REST.svc/UploadString/?fileName="; @H_502_6@

@H_502_6@

                // 用于演示以流的形式上传数据 @H_502_6@

                string _urlStream = "http://localhost:3036/REST.svc/UploadStream/?fileName="; @H_502_6@

@H_502_6@

                public WebClientUpload() @H_502_6@

                { @H_502_6@

                        InitializeComponent(); @H_502_6@

                } @H_502_6@

@H_502_6@

                /// <summary> @H_502_6@

                /// 演示字符串式上传 @H_502_6@

                /// </summary> @H_502_6@

                /// <param name="sender"></param> @H_502_6@

                /// <param name="e"></param> @H_502_6@

                private void btnString_Click(object sender,RoutedEventArgs e) @H_502_6@

                { @H_502_6@

                        string data = ""; @H_502_6@

@H_502_6@

                        /* @H_502_6@

                         * OpenFileDialog - 文件对话框 @H_502_6@

                         *         ShowDialog() - 显示文件对话框。在文件对话框中单击“确定”则返回true,反之则返回false @H_502_6@

                         *         File - 所选文件的 FileInfo 对象 @H_502_6@

                         */
@H_502_6@

@H_502_6@

                        OpenFileDialog dialog = new OpenFileDialog(); @H_502_6@

@H_502_6@

                        if (dialog.ShowDialog() == true) @H_502_6@

                        { @H_502_6@

                                using (FileStream fs = dialog.File.OpenRead()) @H_502_6@

                                { @H_502_6@

                                        byte[] buffer = new byte[fs.Length]; @H_502_6@

                                        fs.Read(buffer,buffer.Length); @H_502_6@

@H_502_6@

                                        // 将指定的 byte[] 转换为字符串(使用Base64编码) @H_502_6@

                                        data = Convert.ToBase64String(buffer); @H_502_6@

                                } @H_502_6@

@H_502_6@

                                /* @H_502_6@

                                 * WebClient - 将数据发送到指定的 URI,或者从指定的 URI 接收数据的类 @H_502_6@

                                 *         UploadStringCompleted - 上传数据完毕后(包括取消操作及有错误发生时)所触发的事件 @H_502_6@

                                 *         UploadProgressChanged - 上传数据过程中所触发的事件。正在上传上传完全部数据后会触发 @H_502_6@

                                 *         Headers - 与请求相关的的标头的 key/value 对集合 @H_502_6@

                                 *         UploadStringAsync(Uri address,string data) - 以字符串的形式上传数据到指定的 URI。所使用的 HTTP 方法认为 POST @H_502_6@

                                 *                 Uri address - 接收上传数据的 URI @H_502_6@

                                 *                 string data - 需要上传的数据 @H_502_6@

                                 */
@H_502_6@

@H_502_6@

                                System.Net.WebClient clientUploadString = new System.Net.WebClient(); @H_502_6@

@H_502_6@

                                clientUploadString.UploadStringCompleted += new UploadStringCompletedEventHandler(clientUploadString_UploadStringCompleted); @H_502_6@

                                clientUploadString.UploadProgressChanged += new UploadProgressChangedEventHandler(clientUploadString_UploadProgressChanged); @H_502_6@

@H_502_6@

                                Uri uri = new Uri(_urlString + dialog.File.Name,UriKind.Absolute); @H_502_6@

                                clientUploadString.Headers["Content-Type"] = "application/x-www-form-urlencoded"; @H_502_6@

@H_502_6@

                                clientUploadString.UploadStringAsync(uri,data); @H_502_6@

                        } @H_502_6@

                } @H_502_6@

@H_502_6@

                void clientUploadString_UploadProgressChanged(object sender,UploadProgressChangedEventArgs e) @H_502_6@

                { @H_502_6@

                        /* @H_502_6@

                         * UploadProgressChangedEventArgs.Progresspercentage - 上传完成的百分比 @H_502_6@

                         * UploadProgressChangedEventArgs.BytesSent - 当前发送的字节数 @H_502_6@

                         * UploadProgressChangedEventArgs.TotalBytesToSend - 总共需要发送的字节数 @H_502_6@

                         * UploadProgressChangedEventArgs.BytesReceived - 当前接收的字节数 @H_502_6@

                         * UploadProgressChangedEventArgs.TotalBytesToReceive - 总共需要接收的字节数 @H_502_6@

                         * UploadProgressChangedEventArgs.UserState - 用户标识 @H_502_6@

                         */
@H_502_6@

@H_502_6@

                        lblMsgString.Text = string.Format("上传完成的百分比:{0}\r\n当前发送的字节数:{1}\r\n总共需要发送的字节数:{2}\r\n当前接收的字节数:{3}\r\n总共需要接收的字节数:{4}\r\n",@H_502_6@

                                e.Progresspercentage.ToString(),@H_502_6@

                                e.BytesSent.ToString(),@H_502_6@

                                e.TotalBytesToSend.ToString(),@H_502_6@

                                e.BytesReceived.ToString(),@H_502_6@

                                e.TotalBytesToReceive.ToString()); @H_502_6@

@H_502_6@

                        progressBarString.Value = (double)e.Progresspercentage; @H_502_6@

                } @H_502_6@

@H_502_6@

                void clientUploadString_UploadStringCompleted(object sender,UploadStringCompletedEventArgs e) @H_502_6@

                { @H_502_6@

                        /* @H_502_6@

                         * UploadStringCompletedEventArgs.Error - 该异步操作期间是否发生了错误 @H_502_6@

                         * UploadStringCompletedEventArgs.Cancelled - 该异步操作是否已被取消 @H_502_6@

                         * UploadStringCompletedEventArgs.Result - 服务端返回的数据(字符串类型) @H_502_6@

                         * UploadStringCompletedEventArgs.UserState - 用户标识 @H_502_6@

                         */
@H_502_6@

@H_502_6@

                        if (e.Error != null) @H_502_6@

                        { @H_502_6@

                                lblMsgString.Text += e.Error.ToString(); @H_502_6@

                                return; @H_502_6@

                        } @H_502_6@

@H_502_6@

                        if (e.Cancelled != true) @H_502_6@

                        { @H_502_6@

                                var jsonObject = System.Json.JsonObject.Parse(e.Result); @H_502_6@

                                 @H_502_6@

                                lblMsgString.Text += string.Format("是否上传成功:{0}",@H_502_6@

                                        (bool)jsonObject); @H_502_6@

                        } @H_502_6@

                } @H_502_6@

@H_502_6@

@H_502_6@

@H_502_6@

                /// <summary> @H_502_6@

                /// 演示流式上传 @H_502_6@

                /// </summary> @H_502_6@

                /// <param name="sender"></param> @H_502_6@

                /// <param name="e"></param> @H_502_6@

                private void btnStream_Click(object sender,RoutedEventArgs e) @H_502_6@

                { @H_502_6@

                        FileStream fs = null; @H_502_6@

@H_502_6@

                        OpenFileDialog dialog = new OpenFileDialog(); @H_502_6@

@H_502_6@

                        if (dialog.ShowDialog() == true) @H_502_6@

                        { @H_502_6@

                                fs = dialog.File.OpenRead(); @H_502_6@

@H_502_6@

                                /* @H_502_6@

                                 * WebClient - 将数据发送到指定的 URI,或者从指定的 URI 接收数据的类 @H_502_6@

                                 *         OpenWriteCompleted - 在打开用于上传的流完成时(包括取消操作及有错误发生时)所触发的事件 @H_502_6@

                                 *         WriteStreamClosed - 在写入数据流的异步操作完成时(包括取消操作及有错误发生时)所触发的事件 @H_502_6@

                                 *         UploadProgressChanged - 上传数据过程中所触发的事件。如果调用 OpenWriteAsync() 则不会触发此事件 @H_502_6@

                                 *         Headers - 与请求相关的的标头的 key/value 对集合 @H_502_6@

                                 *         OpenWriteAsync(Uri address,string method,Object userToken) - 打开流以使用指定的方法向指定的 URI 写入数据 @H_502_6@

                                 *                 Uri address - 接收上传数据的 URI @H_502_6@

                                 *                 string method - 所使用的 HTTP 方法(POST 或 GET) @H_502_6@

                                 *                 Object userToken - 需要上传的数据流 @H_502_6@

                                 */
@H_502_6@

@H_502_6@

                                System.Net.WebClient clientUploadStream = new System.Net.WebClient(); @H_502_6@

@H_502_6@

                                clientUploadStream.OpenWriteCompleted += new OpenWriteCompletedEventHandler(clientUploadStream_OpenWriteCompleted); @H_502_6@

                                clientUploadStream.UploadProgressChanged += new UploadProgressChangedEventHandler(clientUploadStream_UploadProgressChanged); @H_502_6@

                                clientUploadStream.WriteStreamClosed += new WriteStreamClosedEventHandler(clientUploadStream_WriteStreamClosed); @H_502_6@

@H_502_6@

                                Uri uri = new Uri(_urlStream + dialog.File.Name,UriKind.Absolute); @H_502_6@

                                clientUploadStream.Headers["Content-Type"] = "multipart/form-data"; @H_502_6@

@H_502_6@

                                clientUploadStream.OpenWriteAsync(uri,"POST",fs); @H_502_6@

                        } @H_502_6@

                } @H_502_6@

@H_502_6@

                void clientUploadStream_UploadProgressChanged(object sender,UploadProgressChangedEventArgs e) @H_502_6@

                { @H_502_6@

                        // 因为是调用 OpenWriteAsync(),所以不会触发 UploadProgressChanged 事件 @H_502_6@

@H_502_6@

                        lblMsgString.Text = string.Format("上传完成的百分比:{0}\r\n当前发送的字节数:{1}\r\n总共需要发送的字节数:{2}\r\n当前接收的字节数:{3}\r\n总共需要接收的字节数:{4}\r\n",@H_502_6@

                                e.TotalBytesToReceive.ToString()); @H_502_6@

@H_502_6@

                        progressBarStream.Value = (double)e.Progresspercentage; @H_502_6@

                } @H_502_6@

@H_502_6@

                void clientUploadStream_OpenWriteCompleted(object sender,OpenWriteCompletedEventArgs e) @H_502_6@

                { @H_502_6@

                        System.Net.WebClient client = sender as System.Net.WebClient; @H_502_6@

@H_502_6@

                        if (e.Error != null) @H_502_6@

                        { @H_502_6@

                                lblMsgStream.Text += e.Error.ToString(); @H_502_6@

                                return; @H_502_6@

                        } @H_502_6@

@H_502_6@

                        if (e.Cancelled != true) @H_502_6@

                        { @H_502_6@

                                // e.UserState - 需要上传的流(客户端流) @H_502_6@

                                Stream clientStream = e.UserState as Stream; @H_502_6@

@H_502_6@

                                // e.Result - 目标地址的流(服务端流) @H_502_6@

                                Stream serverStream = e.Result; @H_502_6@

@H_502_6@

                                byte[] buffer = new byte[4096]; @H_502_6@

                                int count = 0; @H_502_6@

@H_502_6@

                                // clientStream.Read - 将需要上传的流读取到指定的字节数组中 @H_502_6@

                                while ((count = clientStream.Read(buffer,buffer.Length)) > 0) @H_502_6@

                                { @H_502_6@

                                        // serverStream.Write - 将指定的字节数组写入到目标地址的流 @H_502_6@

                                        serverStream.Write(buffer,count); @H_502_6@

                                } @H_502_6@

@H_502_6@

                                serverStream.Close(); @H_502_6@

                                clientStream.Close(); @H_502_6@

                        } @H_502_6@

                } @H_502_6@

@H_502_6@

                void clientUploadStream_WriteStreamClosed(object sender,WriteStreamClosedEventArgs e) @H_502_6@

                { @H_502_6@

                        if (e.Error != null) @H_502_6@

                        { @H_502_6@

                                lblMsgStream.Text += e.Error.ToString(); @H_502_6@

                                return; @H_502_6@

                        } @H_502_6@

                        else @H_502_6@

                        { @H_502_6@

                                lblMsgStream.Text += "上传完成"; @H_502_6@

                        } @H_502_6@

                } @H_502_6@

        } @H_502_6@

} @H_502_6@

@H_502_6@

/* @H_502_6@

* 其他: @H_502_6@

* 1、WebClient 对象一次只能启动一个请求。如果在一个请求完成(包括出错和取消)前,即IsBusy为true时,进行第二个请求,则第二个请求将会抛出 NotSupportedException 类型的异常 @H_502_6@

* 2、如果 WebClient 对象的 BaseAddress 属性不为空,则 BaseAddress 与 URI(相对地址) 组合在一起构成绝对 URI @H_502_6@

* 3、WebClient 类的 AllowReadStreamBuffering 属性:是否对从 Internet 资源接收的数据做缓冲处理。认值为true,将数据缓存在客户端内存中,以便随时被应用程序读取 @H_502_6@

*/
 
 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐