当前位置: 首页 > news >正文

工作招聘58同城/整站seo外包

工作招聘58同城,整站seo外包,万网网站备案授权书,seo发展现状http://blog.csdn.net/fangxing80/article/details/6261431 前面2篇blog,主要在介绍REST WCF如何通过json/xml 和客户端完成交互。 这篇文章将对REST WCF的原生(RAW)流传输进行一次实例分析。OK,还是利用 WCF REST Service Application 的工程模板&#…

http://blog.csdn.net/fangxing80/article/details/6261431

前面2篇blog,主要在介绍REST WCF如何通过json/xml 和客户端完成交互。 这篇文章将对REST WCF的原生(RAW)流传输进行一次实例分析。
OK,还是利用 WCF REST Service Application 的工程模板,创建我们的REST WCF工程。
因为WCF REST服务不需要公开metadata, 所以 OperationContract 的定义也省略了。直接定义[ServiceContract] 如果修改模板中Service名,Global.asax中的RegisterRoutes方法也必须相应的修改。 下面是服务的实现:

[c-sharp] view plain copy print?
  1. [ServiceContract]  
  2. [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]  
  3. [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, Namespace="")]  
  4. public class ImageService  
  5. {  
  6.     [WebGet(UriTemplate = "{image}")]  
  7.     public Stream GetImage(string image)  
  8.     {  
  9.         var imageType = Path.GetExtension(image).TrimStart('.');  
  10.         WebOperationContext.Current.OutgoingResponse.ContentType = "image/" + imageType;  
  11.         var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images");  
  12.         var file = Path.Combine(dir, image);  
  13.         return File.OpenRead(file);  
  14.     }  
  15.   
  16.     [WebInvoke(UriTemplate = "Add/{image}", Method="POST")]  
  17.     public void AddImage(Stream stream, string image)  
  18.     {  
  19.         var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images");  
  20.         var file = Path.Combine(dir, image);  
  21.         var bitmap = Bitmap.FromStream(stream);  
  22.         bitmap.Save(file);  
  23.     }  
  24.   
  25.     [WebGet(UriTemplate = "ListAll", ResponseFormat=WebMessageFormat.Xml)]  
  26.     public string[] GetAllImageNames()  
  27.     {  
  28.         var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images");  
  29.         var files = Directory.GetFiles(dir);  
  30.         var images = new List<string>();  
  31.         foreach (var file in files)  
  32.         {  
  33.             var ext = Path.GetExtension(file);  
  34.             if (ext == ".jpg" || ext == ".gif")  
  35.                 images.Add(file);  
  36.         }  
  37.         for (int i = 0; i < images.Count; i++)  
  38.             images[i] = Path.GetFileName(images[i]);  
  39.         return images.ToArray();  
  40.     }  
  41. }  

[ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, Namespace="")] public class ImageService { [WebGet(UriTemplate = "{image}")] public Stream GetImage(string image) { var imageType = Path.GetExtension(image).TrimStart('.'); WebOperationContext.Current.OutgoingResponse.ContentType = "image/" + imageType; var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images"); var file = Path.Combine(dir, image); return File.OpenRead(file); } [WebInvoke(UriTemplate = "Add/{image}", Method="POST")] public void AddImage(Stream stream, string image) { var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images"); var file = Path.Combine(dir, image); var bitmap = Bitmap.FromStream(stream); bitmap.Save(file); } [WebGet(UriTemplate = "ListAll", ResponseFormat=WebMessageFormat.Xml)] public string[] GetAllImageNames() { var dir = System.Web.HttpContext.Current.Server.MapPath("~/Images"); var files = Directory.GetFiles(dir); var images = new List<string>(); foreach (var file in files) { var ext = Path.GetExtension(file); if (ext == ".jpg" || ext == ".gif") images.Add(file); } for (int i = 0; i < images.Count; i++) images[i] = Path.GetFileName(images[i]); return images.ToArray(); } }
- GetImage 用于返回图片 Stream, - AddImage 用于接受图片 Stream 并保存, - GetAllImageNames 返回所有图片名。
在Http协议中,通过content-type控制客户端的解析行为。当content-type是"image/jpg"或者是"image/gif"的时候, 浏览器就能够直接显示图片了。因此,在代码里有这样的设定: WebOperationContext.Current.OutgoingResponse.ContentType = "image/" + imageType; 还可以通过 OutgoingResponse.Header 控制缓存。另外,这个REST WCF是建立在一个Web Application中, 我们还可以利用  System.Web.HttpContext.Current.Server.MapPath 方法,获得物理路径。
我们知道一般的WCF服务中,可以实现Streamed传输。在那种场合下,服务契约必须的参数或者返回值必须是Stream,且不能有别的类型的参数(要传递别的参数可以通过MessageHeader)。但是在上面的示例代码中,我定义的 AddImage 就有两个参数: 一个是Stream,还有一个是string。这个string参数其实是通过url传递的: UriTemplate = "Add/{image}",且这两个参数没有顺序要求。 如果没有写"{image}"会抛出下面的异常(因为Request的Body已经被定义为Stream,图片名只能通过Url传过来。) Operation 'AddImage' of contract 'ImageService' specifies multiple request body parameters to be serialized without any wrapper elements. At most one body parameter can be serialized without wrapper elements. Either remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped.
运行服务,直接在浏览器里输入服务URL:http://localhost:3577/ImageService/GIF002.gif 我们就可以看到结果了。 另外,利用REST WCF返回原生流的特性,我们完全可以取代以前在 ASP.NET 中专门生成验证码或者图片读取步骤的页面类, 是不是很方便?

为了体现 REST WCF 的便利性, 我设计了一个 WPF 的客户端: 客户端代码:

[c-sharp] view plain copy print?
  1. public partial class MainWindow : Window  
  2. {  
  3.     public MainWindow()  
  4.     {  
  5.         InitializeComponent();  
  6.     }  
  7.   
  8.     private void Window_Loaded(object sender, RoutedEventArgs e)  
  9.     {  
  10.         op.RestoreDirectory = true;  
  11.         op.Filter = "Jpeg Files(*.jpg)|*.jpg|Gif Files(*.gif)|*.gif";  
  12.   
  13.         BindData();  
  14.     }  
  15.   
  16.     private void BindData()  
  17.     {  
  18.         var url = "http://localhost:3577/ImageService/ListAll";  
  19.         var client = new HttpClient();  
  20.         var stream = client.Get(url).Content.ReadAsStream();  
  21.         var dataSer = new DataContractSerializer(typeof(string[]));  
  22.         var obj = (string[])dataSer.ReadObject(stream);  
  23.         this.listBox1.DataContext = obj;  
  24.     }  
  25.   
  26.     private Microsoft.Win32.OpenFileDialog op = new Microsoft.Win32.OpenFileDialog();  
  27.   
  28.     private void button1_Click(object sender, RoutedEventArgs e)  
  29.     {  
  30.         var ret = op.ShowDialog();  
  31.         if (!ret.HasValue || !ret.Value || !op.CheckFileExists) return;  
  32.         var file = op.FileName;  
  33.         var name = System.IO.Path.GetFileName(file);  
  34.         var url = "http://localhost:3577/ImageService/Add/" + name;  
  35.         var client = new HttpClient();  
  36.         var content = HttpContent.Create(File.OpenRead(file));  
  37.         var resp = client.Post(url, content);  
  38.         resp.EnsureStatusIsSuccessful();  
  39.   
  40.         BindData();  
  41.     }  
  42.   
  43.     private void button2_Click(object sender, RoutedEventArgs e)  
  44.     {  
  45.         this.Close();  
  46.     }  
  47. }  
  48.   
  49. [ValueConversion(typeof(string), typeof(string))]  
  50. public class UriConverter : IValueConverter  
  51. {  
  52.     public object Convert(object value, Type targetType,   
  53.         object parameter, System.Globalization.CultureInfo culture)  
  54.     {  
  55.         if (value == null) return null;  
  56.         string sourceValue = value.ToString();  
  57.         return "http://localhost:3577/ImageService/" + sourceValue;  
  58.     }  
  59.   
  60.     public object ConvertBack(object value, Type targetType,  
  61.         object parameter, System.Globalization.CultureInfo culture)  
  62.     {  
  63.         return value;  
  64.     }  
  65. }  

public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { op.RestoreDirectory = true; op.Filter = "Jpeg Files(*.jpg)|*.jpg|Gif Files(*.gif)|*.gif"; BindData(); } private void BindData() { var url = "http://localhost:3577/ImageService/ListAll"; var client = new HttpClient(); var stream = client.Get(url).Content.ReadAsStream(); var dataSer = new DataContractSerializer(typeof(string[])); var obj = (string[])dataSer.ReadObject(stream); this.listBox1.DataContext = obj; } private Microsoft.Win32.OpenFileDialog op = new Microsoft.Win32.OpenFileDialog(); private void button1_Click(object sender, RoutedEventArgs e) { var ret = op.ShowDialog(); if (!ret.HasValue || !ret.Value || !op.CheckFileExists) return; var file = op.FileName; var name = System.IO.Path.GetFileName(file); var url = "http://localhost:3577/ImageService/Add/" + name; var client = new HttpClient(); var content = HttpContent.Create(File.OpenRead(file)); var resp = client.Post(url, content); resp.EnsureStatusIsSuccessful(); BindData(); } private void button2_Click(object sender, RoutedEventArgs e) { this.Close(); } } [ValueConversion(typeof(string), typeof(string))] public class UriConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) return null; string sourceValue = value.ToString(); return "http://localhost:3577/ImageService/" + sourceValue; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value; } } 实现的注意点: 1) 获得所有图片名,服务端返回的是string[]的序列化的xml,用DataContractSerializer反序列化。     var dataSer = new DataContractSerializer(typeof(string[])); 2) WPF中的OpenFileDialog在Microsoft.Win32命名空间下。(必须引用WindowsBase.dll) 3) 利用 Microsoft.Http.HttpClient 上传图片, 实例化 HttpContent, 通过client.Post上传     var url = "http://localhost:3577/ImageService/Add/" + name;     var client = new HttpClient();     var content = HttpContent.Create(File.OpenRead(file));     var resp = client.Post(url, content);     resp.EnsureStatusIsSuccessful(); 4) 定义了一个Converter, 将 ListBox 绑定到 Image 控件的 Source     Source="{Binding ElementName=listBox1, Path=SelectedItem, Converter={StaticResource uriConv}}"

 

源代码下载:REST WCF Raw Stream 示例代码

转载于:https://www.cnblogs.com/yf2011/articles/5177890.html

http://www.lbrq.cn/news/1254025.html

相关文章:

  • 手机网站字体大小规范/如何在百度推广网站
  • 网站怎么做404页面的跳转/广州灰色优化网络公司
  • 龙城网站建设/百度站长统计
  • 做网站软件_手机/短视频推广策略
  • 上海到北京高铁票价多少/汕头最好的seo外包
  • 大连网站建设哪家好/百度快速收录提交工具
  • 用c 可以做网站吗/广东近期新闻
  • wordpress修改成中文字体/南宁百度seo排名优化软件
  • 安徽合肥做网站的公司/网络推广具体内容
  • 永嘉县住房和城乡规划建设局网站/关键词优化公司网站
  • 网站做seo推广 s/百度客服在线咨询
  • 最牛的手机视频网站建设/网络优化工程师前景
  • Tp5即做网站又提供api接口/游戏推广怎么做
  • 怎样学做网站/品牌推广手段
  • 安阳网站建设哪家便宜/百度搜索量
  • 多语种网站建设开发/西安seo学院
  • 三网合一网站怎么做/淘宝关键词指数
  • 龙华做棋牌网站建设/百度新闻发布平台
  • 建设工程招投标与合同管理论文/aso应用优化
  • 连云港网站定制开发/yy直播
  • 山东外贸网站建设/体球网足球世界杯
  • 遵义做网站的/搜索引擎营销的主要模式
  • 怎么样自己建设网站/电商平台运营方案
  • 做视频网站资金多少/今天新闻头条最新消息
  • 重庆做腋臭骑士网站/今日重大新闻头条
  • 手机网站制作服务/长沙seo智优营家
  • 网站建设价格差别/免费制作永久个人网站
  • 山东省住房建设厅网站/云南网站推广公司
  • 广州网站建设程序开发/广告优化师适合女生吗
  • 前端做网站框架/百度权重什么意思
  • 【运维部署篇】OpenShift:企业级容器应用平台全面解析
  • 技术部实习总结
  • 机器学习——集成学习(Ensemble Learning)详解:原理、方法与实战应用
  • Electron-updater + Electron-builder + IIS + NSIS + Blockmap 完整增量更新方案
  • 417页PDF | 2025年“人工智能+”行业标杆案例荟萃
  • 26-数据仓库与Apache Hive