12 大仍在使用的过时技术
虽说科技在近年来迎来了前所未来的巨大飞跃,在对于许多普通人来说,我们的日常生活中还是能够时时刻刻看到许多“古老”技术的存在。比如,对于诸如拨号上网、磁带播放器、录像机等这些物品相信大家都不会陌生。就此,美国消费电子协会(CEA)行业分析主管史蒂夫-科尼格(Steve Koenig)就表示:“真正淘汰一项技术所需要的时间恐怕会超出你的想象。” 与此同时,美国消费电子协会日前公布的一份研究报告也指出,“大约仅有13-15%的人们是新兴技术的早期试用者,另有超过60%的人则通常会在一段时间以后才选择升级自己的老设备、或者采纳新技术。 对此,美国知名科技媒体日前就对“现代人们仍然使用的12大过时技术”进行了一番盘点,具体内容如下: 1. 拨号上网 我 记得在我上一次使用拨号上网的时候是希望从某网站上下载一份学习报告,但在忍受了长时间的蚂蚁网速后,我终于下定决心同拨号上网说拜拜。然而,根据皮尤公 布的《互联网与美国人生活习惯研究项目》(Pew Internet & American Life Project)数据显示,大约有4%的 美国人仍然在使用拨号上网。这也就是说,有超过1000万人在以不超过56.6k/s的速度访问互联网! 需要指出的是,这4%的拨号上网用户中可能有一部分是由于地处偏远地区而没有宽带互联网连接(这部分人群大约占据全美总人口的6%),剩下的一部分人则可能是基于费用或者其他原因而没有安装宽带。 2. 传呼机 在上世纪90年代,人们彰显自己身份的标志之一便是传呼机。在那个年代,如果你拥有一部传呼机的话,人们通常会把你认作是企业CEO,或者是一名外科医生,因此续续时刻同外界保持联系。但在几年的时间内,可以同时让人们收发信息手机的出现已经逐渐使传呼机退出了历史舞台。 尽 管目前手机已经拥有着绝对统治地位,但传呼机仍然拥有着一定的市场份额。根据美国消费电子协会的报告指出,2012年美国人总共采购了总金额为700万美 元的传呼机,数量约为1万部左右。如果说你希望在能够保持同外界接触的情况下保留一定个人隐私的话,传呼机似乎的确是一个不错的选择。 说到这里,你可能会想象到一个个其貌不扬的毒品贩子在街头通过传呼机联络的画面。但事实上,现在有许多医院仍然倾向于为医生配备一部传呼机,因为他们认为传呼机网络相比手机网络更加可靠,尤其是在紧急情况发生的情况时。 3. 点阵打印机 尽 管在很多场合内,点阵打印机的地位早已被喷墨打印机所取代,但根据知名市场研究公司NPD公布的数据显示,美国人在2012全年还是购买了大约2万部全新 点阵打印机。而且,在亚马逊购物网站上,我们仍然发现点阵打印机拥有一个完全独立的板块,其售价也往往比普通的喷墨打印机贵上了一倍左右(最低售价为 205美元)。 那么,现在还有哪些企业或者工作人员需要使用到这个出生于1983年的老旧技术呢?事实上,许多仓库、销售点或者其他一些业务系统都仍然十分依赖于这一设备,因为他们往往需要开具一式五联的单据,而开具这样单据的最好方法便是通过点阵打印机来实现。 4. PDA(个人数字助理) 在 很久以前,我曾经拥有过一部Palm Pilot个人助理设备,这是有史以来用户第一次可以从通讯录里直拨电话的设备。随后,我又用上了拥有彩色显示屏幕 的Cassiopeia。但是,我和个人数字助理设备之间的情缘也就到此为止了,因为智能手机的出现几乎使PDA变得一无是处。 然而,根据美国消费电子协会给出的数据显示,去年美国地区依然卖出了大约35万部全新PDA设备。该协会行业分析主管史蒂夫-科尼格透露,“人们购买PDA并不是因为他们因循守旧,而是因为许多垂直市场依旧需要使用随身PDA来收集数据,尤其是在仓库和医院这样的特殊办公场所”。 5. 公共电话 根 据美国公共交流委员会(American Public Communications Council)在2012年第三季度给出的数据显示,全美境内 目前仍然拥有多达30500个公共电话,对于知名乐队Maroon 5的粉丝来说,这或许是个不错的消息(该乐队的最近一张专辑的主打歌曲就是 “Pay Phone”)。 事实上,这些公共电话直到现在也仍然在发挥着自己的巨大作用。美国公共交流委员会透露,2012年人们总计使用这些公共电话拨打了超过5000万次电话。那么,到底有哪些人会直到现在仍然在使用公共电话呢? 分析人士认为,那些无力购买一部手机的低收入群体、希望保持自己匿名身份的人、手机在路上突然没电的用户以及那些突然无法接收运营商信号的人都有可能使用到公共电话服务。 6. 录像带和磁带 在互联网高速发展的时代,人们已经可以在线下载许许多多的音乐和其他数字内容。亦或者,用户也可以选择继续沉浸在1985年的生活中,也就是利用磁带录下广播中的歌曲、利用录像带录下电视中正在播放的节目。 7. 固定电话 在2012年中期,全美大约34%成年人家中没有安装固定电话。但与此同时,仍有66%的成年人不仅在家里安装了固定电话,而且还会为这套系统购买新硬件。根据美国消费电子协会给出的数据显示,美国人2012年总共购买了500万部固定电话和2150万部无绳电话。 8. CRT电视 虽 然目前仍然有相当数量的美国家庭在使用老旧的CRT电视,但大多数消费者电子产品公司已经基于种种理由而停止了这类产品的生产、开发工作。因为这些CRT 电视不仅丑陋、过时,其内部笨重零部件的生产和海外运输成本也十分高昂。但是,根据知名市场研究机构NPD给出的数据显示,美国人在去年总计购买了1万台 全新CRT电视,其中大多数CRT电视的主要观看群体是儿童。 9. 胶卷 现在,绝大多数用户手中的智能手机都已经配置了高清摄像头,但传统一些的卡片式照相机以及数码单反相机也依旧十分流行,现在用户甚至只需要花费不到100美元的价格便可以购买一部成像效果相当不错的数码相机。因此,考虑到用户利用数码相机所拍摄图片的持久性、可分享性以及高品质,我们实在很难想象现在依旧有人在使用老式胶卷相机。 然而根据NPD给出的数据显示,美国人似乎依旧对于这种老式的生活记录方式情有独钟,因为美国地区在去年依旧卖出了高达3500万卷相机胶卷。其中,部分人们是Lomo拍摄方式的狂热爱好者,另有一部分人则仅仅是不愿意同自己的宝丽来相机说分手而已。 10. Windows 98和Windows 2000操作系统 虽然绝大多的人们都喜欢驾驶配置了诸如先进燃油喷射、安全气囊和操控体验的新款汽车,但世界上总有那么一部分人更喜欢驾驶老式的本田Civic车型,而这一点在人们所使用的一些复古操作系统中也可见一斑。 据 市场调研究公司网络应用(Net Applications)公布的数据显示,目前仍然有0.05%的美国人在使用Windows 98和 Windows 2000操作系统。与此同时,The Computer Industry Almanac则表示,考虑到目前美国总计拥有3.11亿部电脑的事实,我们可以发现仍有超过15万人在使用来自上个世纪的操作系统。 11. 传真机 早在上世纪70年代,传真机就成为了一款必不可少的办公室设备。但在过去了整整40年后,随着电子邮件、即时通讯应用等服务的兴起,传真机似乎已经失去了自己继续存在下去的理由。然而,事情的发展却没有同人们的想象保持一致,由于许多商业合同的签订仍然需要企业高层的亲笔签名,因此传真机在现代企业中仍然十分普遍。 根据NPD的数据显示,美国人总计在2012年内购买了35万部新传真机,但相比2011年同比下降了14%。 12. 黑胶唱片机 当猫王正处于流行舞台最中央的时候,黑胶唱片机也成为了当时许多年轻人听歌的第一选择。但是,在当今数字音乐下载和流媒体服务大红大紫的年代,看似“过时”的黑胶唱片却显示出了卷土重来之势。 尽 管这一技术已经面世了很长时间,但现在有越来越多的新唱片开始以黑胶唱片的形式发行,其中就包括来自蠢朋克乐队(Daft.Punk)和僵尸周末乐队 (Vampire Weekend)的最新作品。根据美国知名数据分析机构Nielsen SoundScan日前公布的数据显示,美国人在2012年总 计购买了460万张黑胶唱片,同比上升了17.7%。尽管这一数字相比2012年1.18亿数字专辑的销量还相去甚远,但这一“古老”产业的复兴似乎已经 成为了一件不争的事实。 转自:http://www.oschina.net/news/45650/12-outdated-technology
View DetailsNBA明星前锋克里斯·波什:我们为何要学习编程
导语:NBA热火球员克里斯·波什还是个极客,对科学和编程有着浓烈的兴趣。被问及为何学习编程时,他说“仅仅是为了理解这个世界的运转方式。如果说蛮力开创了人类第一个纪元,自动化技术就是第二个,(学编程)是我们跟上时代步伐的唯一手段“。来听他谈谈编程如何影响这个时代的进程吧! 我知道,要求每个人——从流浪汉到小屁孩——都去学习编程,多少有些可笑。因为有一些更重要的事情,同样等着你去完成。 但我不认为,我们可以忽视学习编程的重要性。 作为一个生长在90年代,且有着技术控父母的小孩,我注意到我周围的世界全绕着一个轴在转,1和0组成的不同模型就是驱动世界运转的力量。忽视设计和编写这些模型的学习,我们就都太傻了。如果说,蛮力开创了人类第一个纪元,自动化是第二个,那编程是我们与时俱进的唯一手段。在未来,大多数工作会赋予那些懂编程的人。 上网,打电话,外出购物,我们无时不刻不在使用代码,它是这个世界运转的基础。能够对如此重要的事物有所了解,我觉得非常有益。 大部分运动员,在学校的时候就已选择了自己日后的职业运动项目。对我来说,这是在高中,一切发生的时候。一方面,你身体长得很快,长于运动;另一方面,大人们告诉你,要不论喜恶地去尝试不同事物,从中找到自己的规划。在那个年纪,尝试是一件很有意思的事情。 在加入NBA前我就清楚知道,要让我的未来——也是每个人的未来——足够有保障,我必须要有掌控0和1的能力,尽管此时我的球衣正挂在林肯高中的体育馆里。幸运的是,总在测试小物件、操作眼花缭乱的CAD软件的极客父母,帮助我把手放到学习编程的键盘上,而不是托着篮球,或阻止对手的进攻。 从我记事起,我的妈妈就经营着一个“电脑帮帮忙”的生意。可以说我是在电脑堆里长大的。后来,她去了德州仪器工作。每当我们放学回家,都会有一堆我妈从公司里带回来的新奇玩意可以把玩。那是我接触第一台数码相机的时候!当人们还在用着AutoCAD时,我父亲做上了职业管道施工,工程实施,并为多家不同的公司做设计。 我是幸运的,因为我的父母在子女教育上有很高水准,他们都是受科学驱使的人。高中时,我加入“天才儿童”组织,一个二年级学生组成的电脑绘图俱乐部。在这里我如鱼得水。高三时,我还加入了少数派工程师协会和全国黑人工程师协会。 我得到高中文凭,但没有从大学毕业。但即使只在佐治亚理工学院(Georgia Tech)待了一年,我依旧保持了对科学和求知的浓烈兴趣。我知道我可以靠这生存。在某些关键时刻,职业运动员要问自己,如果不成功怎么办。于我而言,我想我会拿计算机科学和编程来教育小朋友——越小越好。 关于编程,有趣的是,当我高中第一次摸索图形设计和计算机时,我完全不知道编程为何物。它是几乎一切科技的基础。如果当初在学校有人告诉我,编程可以直接或间接地让上百万人生活得更好,这会更早地激发我的兴趣。只是,我不认为那时候,人们真的意识到编程对当今世界的影响。 像所有精彩的篮球赛事一样,我们仍然可以追赶。 即使现在我的主要兴趣是篮球,我仍旧在学习和探索。我想教孩子编程,因为它可以创造出如此吸引人的应用。只要肯下功夫,这并不难。你尽可心说“但这对你的事业没有帮助”——我会告诉你,确实有。透过编程,让我明白了很多人生道理。 此时,学习编程对我而言,仅仅是为理解这个世界的运转方式。 而且,它很酷。我打的是篮球,但我知道我学编程的同辈们在“酷”之前需要面对非常多的嘲笑、戏弄。很多人无法想像一个将近七尺高的人也会成为攻击对象,但我也被欺负了好一阵。我很幸运,体育给了我在极客上的自信。我打的是篮球,所以我能按照自己的节奏来突围,并逆转观众的想法。 这些年来我看过很多有我的视频——赛事、MV、广告——但在code.org视频中是我人生最酷的时刻。当粉丝发推@我,说老师给他们看的视频中,我同世界上最有名的科技符号一并出现时,我明白了一件事:书呆子们终于一雪前耻。 我是麦阿密热火队员,我的球衣背面是“1”。对我来说,胜利并不是“胜利”,它是01110111 01101001 01101110 01101110 01101001 01101110 01100111(胜利"winning"的二进制代码)。 (本文为迈阿密热火1号球员克里斯·波什发表在《连线》文章) 转自:http://www.oschina.net/news/45652/why-we-should-learning-programming
View Details20 个用于处理页面滚动效果的 jQuery 插件
对设计和开发一个网站来说,web开发者不能低估了网站滚动效果的重要性。如今,设计者们都视为一大挑战了,在网站中设计出吸引眼球的高效视觉滚动效果。幸运的是有各种各样的jquery 滚动插件可供他们使用,有了这些插件,他们可以根据页面滚动的位置做出很多吸引眼球的效果,像背景变换、动画等等。 本文中我收集了20款可以帮你实现很绚效果的Jquery滚动插件。 有了下面的这些jQuery滚动插件,你可以随意的让网站中的任何元素滚动, 使网站变得更加绚丽、吸引眼球。 1. One Page scroll One Page Scroll,一个jQuery插件,简化了类似网站的创建。它需要很少的设置,只需要创建HTML结构,调用函数就可以了。 可选的,easing功能,它的速度和循环行为也可以设置。而且,它已经支持对每个页面SEO友好的URL。 2. Scrolld Scrolld.js是一个jQuery的独特开源插件。Scrolld.js提供了一种完美的高精度的布局方法,且使用实时更新的数据值生成导航。使用Scrolld.js滚动到项目将永远精准且将提供最好的用户体验。Scrolld.js是专门为支持响应式布局而设计的,可以将页面长导航变成一个简单的任务栏。Scrolld.js设计初衷是为能方便使用,并能够在几分钟内快速部署。 3. Animate Scroll AnimateScroll 是一个简单的jQuery插件,它用来为滚动增加延迟效果. 可以自定义滚动样式(30多种滚动效果)和滚动速度. 还有一个可以操纵"滚动结束位置"的"padding"选项. 这个插件不局限于整个页面,某个特定的包裹元素也可以作为其目标. 4. JInvertScroll jInvertScroll 是一个操纵默认滚动行为和强制水平滚动的jQuery插件.它通过onScroll回调函数简化了视察效果的创建,我们可以在onScroll回调函数中为任意元素增加动画效果.该插件很小,只有不到1KB大小,而且几乎不需要任何配置就可以工作. 为某个包裹元素添加一个特定的样式类然后调用一个JS方法就足够了. 5. Smint Smint 是一个帮助开发者在单页面风格的网站中创建导航. 它有两个主要的元素, 一个是不动的导航条,当你向下滚动页面的时候它会停留在页面的顶部,另一个是菜单按钮,当你点击的时候会自动将页面滚动到相应的区域. SMINT插件很简单,所以只有一个控制页面滚动速度的选项. 默认的速度是500毫秒 (半秒钟),但你可以将它设置为任意你喜欢的值. 下载的文件中包含一个demo,所以你可以轻松地将它作为你自己单页面网站的模板. 6. jQuery Arbitrary Anchor Plugin jQuery Arbitrary Anchor Plugin 允许页面滚动到页面中任意的基于jQuery/CSS选择器的对象上. 你可以通过在页面URL的#后面添加一个jQuery/CSS选择器来创建一个有用并且整洁的动态锚点滚动效果. 该插件继承了普通锚点的功能,也就是说,一个拥有名值属性的锚点标签仍然可以被正常地滚动到. 一个具有与锚点相同值的ID属性的元素也具有同样的效果. 这个小小的插件可以被应用到任何元素上. 7. ScrollUp ScrollUp 是一个轻量级的jQuery插件,它用来轻松实现自定义可以在任意网站使用的"滚动到顶部"效果.如果想创建一个可见的线条来帮助确定距离顶端的理想滚动距离,你需要为activeOverlay设置项制定一个有效的CSS颜色.ScrollUp可以通过CSS实现完全可定制,这使得它可以被很容易的应用到你的项目中. 只需要在你的CSS文件中scrollUp生成的ID设置你的样式即可. 它是基于MIT协议发布的. 8. jQuery Stick ‘em jQuery Stick ‘em 可以使内容在滚动的时候固定在某个点上.有时候,我们有一些很高的图片. 所以当你滚动到图片的底部之后,你将不得不滚回到描述你刚才看的图片的文字处. 解决办法就是当你滚动页面的时候把内容固定. 坑爹的是,我们不能仅仅把文字的位置设置为:fixed,一旦滚动到页面底部就玩完了.由于有时候页面上会有很多部分,我们不得不在某个点将内容"取消固定". 那么让我们来解决这个问题,jQuery Stick’em就能够实现该功能. 9. Infinity.js Infinity.js是用于web的表格视图UI库:它能够加速长列表的滚动并且保证你的无限的数据流畅和稳定。它体积小,久经测试而且性能很好。这是Github上最火的代码,并且以BSD协议分发。被注释的源代码作为演示Infinity关闭与开启是可用的。 Infinity.js是Airbnd公司开发的,除了流行许愿列表和朋友订阅部门,现在已经子啊日常的生产中使用。它只依赖于jQuery。 11. Mobiscroll Mobiscroll 是一个为移动设备(Android手机,iPhone,iPad,Galaxy Tab)准备的轮式滚动日期和时间的选择器.它可以被自定义来支持任意自定义的数值,也可以被用作对于本土选择控制的一个直观的替换. 它的样式是可以改变的. 12. Page Scroller Page Scroller 是一个基于JavaScript的强大的流畅滚动导航系统,它使用强大的jQuery库. 该插件可以在任何网站上轻松创建.你可以选择导航菜单的位置,也可以轻松地改变滚动速度.滚动插件需要依赖jQuery1.3以上的版本. 13. WayPoints Waypoints是一个比较小的jQuery框架,通过它可以轻松的在任何滚动元素滚动情况下执行函数。Waypoints可根据用户在页面滚动的位置生成一个比较稳定的流行UI模式。Waypoints遵循MIT和GPL双重协议。 据测试,在jQuery 1.4版本以上兼容IE6+, FF3+, Safari 4+, 和 […]
View DetailsWebRequest之Post写法
Web.Config
1 |
<globalization responseEncoding="gb2312"/> |
CS文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Net; using System.Text; using System.IO; using System.Xml; using System.Collections; using System.Diagnostics; namespace WebPortal { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { CoreProxy.Class1 c = new CoreProxy.Class1(); c.test1(); } protected void Button2_Click(object sender, EventArgs e) { webquerst1(); } public void webquers2() { string html = null; string url = "http://china.alibaba.com/keyword/promotion.htm?catId=14"; WebRequest req = WebRequest.Create(url); req.Method = "POST"; WebResponse res = req.GetResponse(); Stream receiveStream = res.GetResponseStream(); Encoding encode = Encoding.GetEncoding("gb2312"); StreamReader sr = new StreamReader(receiveStream, encode); char[] readbuffer = new char[256]; int n = sr.Read(readbuffer, 0, 256); while (n > 0) { string str = new string(readbuffer, 0, n); html += str; n = sr.Read(readbuffer, 0, 256); } System.Console.Write(html); } //成功!,利用WebRequest 一次Post提交XML内容 public void webquerst1() { WebRequest request = WebRequest.Create("http://192.168.1.244/WebPortal/PortalHandler.ashx"); // Set the Method property of the request to POST. request.Method = "POST"; // Create POST data and convert it to a byte array. System.Xml.XmlDocument xmlpostdata = new System.Xml.XmlDocument(); xmlpostdata.Load(Server.MapPath("XML/20097.xml")); string postData = HttpUtility.HtmlEncode(xmlpostdata.InnerXml); //普通字符串内容 //string postData = "你好,1232355 abdcde"; byte[] byteArray = Encoding.UTF8.GetBytes(postData); // Set the ContentType property of the WebRequest. request.ContentType = "application/x-www-form-urlencoded"; // Set the ContentLength property of the WebRequest. request.ContentLength = byteArray.Length; // Get the request stream. Stream dataStream = request.GetRequestStream(); // Write the data to the request stream. dataStream.Write(byteArray, 0, byteArray.Length); // Close the Stream object. dataStream.Close(); // Get the response. WebResponse response = request.GetResponse(); // Display the status. //Console.WriteLine(((HttpWebResponse)response).StatusDescription); // Get the stream containing content returned by the server. dataStream = response.GetResponseStream(); // Open the stream using a StreamReader for easy access. StreamReader reader = new StreamReader(dataStream); // Read the content. string responseFromServer = reader.ReadToEnd(); // Display the content. //Console.WriteLine(responseFromServer); // Clean up the streams. reader.Close(); dataStream.Close(); response.Close(); } protected void Button3_Click(object sender, EventArgs e) { WebClientPost(); } //重点!! 成功 利用Webclient Post 按字段的方式提交每个字段的内容给服务器端 public void WebClientPost() { System.Xml.XmlDocument xmlpostdata = new System.Xml.XmlDocument(); xmlpostdata.Load(Server.MapPath("XML/OrderClient.xml")); string OrderClient = HttpUtility.HtmlEncode(xmlpostdata.InnerXml); xmlpostdata.Load(Server.MapPath("XML/Order.xml")); string Order = HttpUtility.HtmlEncode(xmlpostdata.InnerXml); xmlpostdata.Load(Server.MapPath("XML/TargetOut.xml")); string TargetOut = HttpUtility.HtmlEncode(xmlpostdata.InnerXml); xmlpostdata.Load(Server.MapPath("XML/ArrayOfOrderDetail.xml")); string ArrayOfOrderDetail = HttpUtility.HtmlEncode(xmlpostdata.InnerXml); System.Net.WebClient WebClientObj = new System.Net.WebClient(); System.Collections.Specialized.NameValueCollection PostVars = new System.Collections.Specialized.NameValueCollection(); //添加值域 PostVars.Add("OrderClient", OrderClient); PostVars.Add("Order", Order); PostVars.Add("TargetOut", TargetOut); PostVars.Add("ArrayOfOrderDetail", ArrayOfOrderDetail); try { byte[] byRemoteInfo = WebClientObj.UploadValues("http://192.168.1.244/WebPortal/PlaceOrder.ashx", "POST", PostVars); //下面都没用啦,就上面一句话就可以了 string sRemoteInfo = System.Text.Encoding.Default.GetString(byRemoteInfo); //这是获取返回信息 Debug.WriteLine(sRemoteInfo); } catch { } } //未测试,使用WebClient 一次性提交POst public static string SendPostRequest(string url, string postString) { byte[] postData = Encoding.UTF8.GetBytes(postString); WebClient client = new WebClient(); client.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); client.Headers.Add("ContentLength", postData.Length.ToString()); byte[] responseData = client.UploadData(url, "POST", postData); return Encoding.Default.GetString(responseData); } /// <summary> /// 这个是用WEbRequest 提交到WEbService 的例子 /// </summary> /// <param name="URL"></param> /// <param name="MethodName"></param> /// <param name="Pars"></param> /// <returns></returns> public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; SetWebRequest(request); byte[] data = EncodePars(Pars); WriteRequestData(request, data); return ReadXmlResponse(request.GetResponse()); } private static void SetWebRequest(HttpWebRequest request) { request.Credentials = CredentialCache.DefaultCredentials; request.Timeout = 10000; } private static void WriteRequestData(HttpWebRequest request, byte[] data) { request.ContentLength = data.Length; Stream writer = request.GetRequestStream(); writer.Write(data, 0, data.Length); writer.Close(); } private static byte[] EncodePars(Hashtable Pars) { return Encoding.UTF8.GetBytes(ParsToString(Pars)); } private static String ParsToString(Hashtable Pars) { StringBuilder sb = new StringBuilder(); foreach (string k in Pars.Keys) { if (sb.Length > 0) { sb.Append("&"); } sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString())); } return sb.ToString(); } private static XmlDocument ReadXmlResponse(WebResponse response) { StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8); String retXml = sr.ReadToEnd(); sr.Close(); XmlDocument doc = new XmlDocument(); doc.LoadXml(retXml); return doc; } private static void AddDelaration(XmlDocument doc) { XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null); doc.InsertBefore(decl, doc.DocumentElement); } protected void Button4_Click(object sender, EventArgs e) { } } } |
ashx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Diagnostics; using System.IO; using System.Xml; namespace WebPortal { /// <summary> /// $codebehindclassname$ 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class PortalHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { string testGet = context.Request["testGet"]; string testPost = context.Request["testPost"]; Debug.WriteLine(testGet); Debug.WriteLine(testPost); //一次性提交的方式 //获得内容长度 int len = context.Request.ContentLength; //获得所有内容流 StreamReader reader = new StreamReader(context.Request.InputStream); //读取内容 string responseFromServer = reader.ReadToEnd(); //字段提交Post方式 string a1 = context.Request["A1"]; string a2 = context.Request["A2"]; string a3 = context.Request["A3"]; //解析Html编码 string re = HttpUtility.HtmlDecode(a1); XmlDocument xd = new XmlDocument(); //加载XML xd.LoadXml(re); context.Response.ContentType = "text/plain"; context.Response.Write(testGet); } public bool IsReusable { get { return false; } } } } |
转自:http://www.cnblogs.com/goody9807/archive/2011/10/08/2202265.html
View Details自己项目中使用的信息采集类(WebRequest)
using System; using System.IO; using System.Net; using System.Text; using System.Web; namespace HP.Common { /// <summary> /// 信息 /// </summary> public class InfoCollect { /// <summary> /// 获取内网页面内容 /// </summary> /// <param name="url"></param> /// <returns></returns> public static string GetPageByInner(string url) { return GetPage("http://" + HttpContext.Current.Request.ServerVariables["SERVER_NAME"] + (HttpContext.Current.Request.ServerVariables["SERVER_PORT"] == "80" ? "" : ":" + HttpContext.Current.Request.ServerVariables["SERVER_PORT"]) + url); } /// <summary> /// 获取公网url内容(GET) /// </summary> /// <param name="url"></param> /// <returns></returns> public static string GetPage(string url) { return GetPage(url, "GET", null); } /// <summary> /// 获取公网url内容(Post方法) /// </summary> /// <param name="url"></param> […]
View Details罗马尼亚程序员的幸福生活
我做了三年的+Perl程序员,以编程为生已经有7年。我生活中克路治-那波卡市(Cluj-Napoca),这是罗马尼亚第二大城市。 四年前我就开始困惑于一个问题:作为一个程序员,我的生活水平和其他国家的程序员有多大差距?那时候我的税后收入大概是每月700欧元(约5830 元,1欧元=8.331人民币)。就当时罗马尼亚的经济水平,整个社会的平均工资低于每月325.91欧元(2715元),我的收入差不多是全国水平的两 倍,这让我产生了一种打死都不离开这里的感觉。然而,这只是一种心理感觉,尽管和其他人比起来我挣得很多,但事实上每月我都挣扎在贫困线上。这种拮据归咎 于我缺乏收入管理,背后的原因是我的妻子刚刚成为一名律师,她现在的收入几乎为0, 克路治-那波卡市的程序员的收入情况 尽管市场在不断的浮动变化,那波卡市里一名有经验的程序员的基本收入大概是这个水平(这里说的收入都是税后水平——净收入): 最初是每月400欧元(3330元) 每6个月涨100欧元(833元)工资 根据个别情况,这个数目会有差异,可能更好,可能更坏。 从好的情况讲,一个程序员的工资水平可以用以下方式获得跳跃式的增长: 通过直接要求 通过跳槽 通过离开公司然后反聘回来 当然,还可以卓越的成绩来跟公司讨价还价,获得涨薪 从不好的情况讲,如果发生下列情况,一个程序员的工资会增长的很慢: 公司的运营状况不好 不善于谈判 一个不关心员工的老板。 自己表现不好 所以,当发现一个有5年经验的程序员拿月薪税后1500欧元(12.5K元)而一个7年经验的只拿月薪1700欧元(14k元)时,就不足为奇了。 几大城市收入/消费水平的比较 最近我发现了这个numbeo网站,它收集世界上各大城市的消费及收入信息,而且,它能让你将两个城市的物价水平,工资及购买力进行比较,你能根据它估算出在另一个城市生活所需要的收入水平。根据它提供的数据,我发现以我现在在那波卡市的收入水平不可能在世界其它城市里生活的很好。(表中的金额都以欧元为单位) 城市 参考收入 收入1 租房价格 收入2 年净收入 伦敦 4762 5,396.93 1,884.00 7,280.93 87,371.20 柏林 2784 3,155.20 800.00 3,955.20 47,462.40 阿姆斯特丹 3826 4,336.13 3,026.00 7,362.13 88,345.60 纽约 4848 5,494.40 2,214.00 7,708.40 92,500.80 旧金山 4484 5,081.87 2,216.00 7,297.87 87,574.40 这些数字的含义 参考收入 – 是指在那个城市如果想让生活质量达到我现在在那波卡市的生活水平,你需要达到的收入水平。按我在那波卡市每月1500欧元收入算。上表中显示的都是税后收入或净收入。 收入1 – 是指如果想在那个城市的生活质量达到在那波卡市的每月1700欧元生活水平质量,你需要达到的净收入。我列出1700欧元水平的原因是它很接近我的水平,这是有7年工作经验的程序员的平均水平。 租房价格 – 一个三居室的价格,非市中心。 收入2 – 这是收入1栏和租房价格的汇总 年净收入 – 是指收入2栏乘以12个月 需要更多的数据 如果在上表中再加入一列各城市的程序员的平均收入信息,那就更清晰了。遗憾的是,我搜查过的大多数网站上只提供税前年收入。因为各地的税收情况各 异,不可能计算出税后收入。所以,如果你是一个在上述城市生活的程序员,并且知道当地平均净收入的情况,请在评论里分享给大家,我会更新到文章里。 克路治-那波卡市(Cluj-Napoca)程序员的生活情况 因为罗马尼亚较低的购买力水平,人们日常的消费水平也比较低。看一下numbeo网站上关于那波卡市的价格水平信息。 1700欧元每月你可以过上任何想要的生活——如果你是个喜欢聚会的人。你的生活大概可以是这样: 一顿三餐(3餐12欧元 * 30 days = 360 欧元/月). 每个周末去最贵的俱乐部玩乐(一晚30欧元 * 8晚 = 240欧元/月) […]
View Details再为设计师准备的 20 个新鲜免费的字体
如果你是一个网页设计师,那么你应该清楚字体在网页设计中的重要性,本文再向你推荐 20 个新鲜免费的字体。 God Bless America Astrolyte Beautiful ES Chocolate Dealer 20DB My special angel font Braxton free font G-Unit Rough Brush Script Eletroz Lainie Day Koch Antiqua Zier ALEX BRUSH FontPunk.com font Porter Sans Block Bumple Rolling Rocker Headline Text Frank-n-Plank Science Fair via djdesignerlab 转自:http://www.oschina.net/news/45512/20-fresh-new-free-fonts-designers
View Details处理WCF异常的方式
任何程序都离不开对异常的处理,良好的异常处理方式可加快寻找出异常的根源,同时也需要避免暴露敏感信息到异常中。WCF这种典型的服务端和客户端交互的程序,服务端的异常更需要适当的处理。下面以一个简单的服务为例,说明WCF中处理异常的方式。 WCF服务定义如下,很明显方法Divide在divisor为0的时候将会抛出异常 View Code 客户端调用如下: using (var client = new CalculateServiceClient()) { try { Console.WriteLine(client.Divide(20, 0)); } catch (FaultException ex) { Console.WriteLine(ex.Reason); } } 首先需要知道的是,WCF的异常信息默认是以FaultException的形式返回到客户端,FaultException的关键属性Reason是对客户端反馈的最重要信息之一。以上客户端代码调用之后,默认的FaultException返回的Message信息如下: 由于内部错误,服务器无法处理该请求。有关该错误的详细信息,请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端,或在打开每个 Microsoft .NET Framework 3.0 SDK 文档的跟踪的同时检查服务器跟踪日志。 根据异常的提示,意思说如果要在客户端看到详细的Exception信息,那么请将ServiceBehavior对应的IncludeExceptionDetailInFaults属性设置为True,通常在配置中表现为如下设置: View Code 通过以上设置之后,客户端输出的内容为“尝试除以零”,这个提示信息跟原始的异常信息是一致,即返回的FaultException中的Reason包含原始异常的Message的值,但是这样处理之后服务端所报出的异常信息直接传到了客户端,比如一些保密信息也可能输出到了客户端,因此对于异常信息必须进行一个封装。最直接的形式莫过于在服务端就把异常给捕获了,并重新throw一个FaultException 服务端的代码改进如下,经过以下改进,那么客户端得到的信息仅仅是"操作失败",同时服务端也记录了异常信息(这时IncludeExceptionDetailInFaults是设置为False的)。 View Code 当然这是FaultException的默认用法,FaultException还支持强类型的异常错误信息,返回更加丰富和精确的错误提示。假设定义如下通用的一个FaultContract类型,将出错时的用户名和线程名字记录到异常信息中,因为异常信息也是通过SOAP格式传输的,因此跟定义其他DataContract的方式一样。 CommonFaultContract 那么服务方法的接口需要增加如下标记,如果不这样标记,那么客户端得到的异常类型依然是FaultException,而不是强类型的异常信息。 [FaultContract(typeof(CommonFaultContract))] int Divide(int dividend, int divisor) 实现方法中抛出异常的部分代码改成如下: 异常处理 这时候重新生成客户端的代理类,然后更新客户端的代码如下,红色部分即获取强类型的异常错误信息。 View Code 当然在具体应用中还需要根据需求,返回不同的信息,构建不同的FaultContract。 以上服务端捕获的异常方法,适用于方法比较少的情况,如果有十多个方法,一个个去写try catch然后做标记等,那么工作量会很大,而且代码也不利于重用。尝试寻找像MVC Controller那样的统一处理Exception的方式,将异常处理都放在基类中,那么只要继承与这个基类的方法都不需要去写try catch去捕获异常。但WCF中似乎没有这样的机制,放弃了这种做法。 最近在研究Enterprise Lib中对WCF的支持时,发现Exception Block中还特地有针对WCF程序异常处理的解决方案,而且满足以上说道的需求,即可记录异常,又可对异常信息进行封装。更重要的时,自动处理运行时的异常信息,不需要挨个方法的去写Try catch。秉承企业库的优秀传统,大部分工作还是通过配置就可以完成了,非常好的解决方案。下面介绍具体的使用步骤。 步骤一: 引用以下dll Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.WCF.dll Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.ObjectBuilder2.dll 步骤2: 在具体的实现类中,增加如下属性标记,其中WcfException为企业库中Exception Block中的一个异常处理策略,具体如何配置异常处理策略,请参考企业库的帮助文档。 [ExceptionShielding("WcfException")] public class CalculateService : ICalculateService 那么只要增加了[ExceptionShielding("WcfException")]这个属性标记之后,所有运行时的异常都将交给策略名为WcfException的异常处理block来处理,在这里就可以执行一些异常记录以及异常封装的操作。 步骤3: 将异常信息封装为FaultException,这个动作也是通过配置来完成。在Exception节点中添加一个Fault Contract Exception Handler。 Fault Contract Exception Handler需要设置以下两个属性值 exceptionMessage:所有异常封装后的错误信息 faultContractType:即返回异常的faltContract类型,这个类型必须指定一个,哪怕方法中没有用到也要,如果方法中有用到,那么客户端那边就能得到强类型FaultException,否则就是普通的FaultException。这里指定为之前定义的CommonFaultContract。 对于faultContract类型的值,还可以通过PropertyMappings来自定义需要从原始异常信息中映射到faultContract的属性中,这个属性可选。 […]
View DetailsWCF:读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
使用WCF传输大数据时,我们都会碰到如题中出现的错误信息,出现这个问题是因为WCF本身的安全机制导致的,限制了客户端与服务器资源传输大小,那我们如何还解决这个问题呢? 针对这个问题,我们要分发送、接受两个方面来解决。 发送大数据:在WCF服务端解决 NetTcpBinding binding = new NetTcpBinding(); binding.MaxReceivedMessageSize= 2147483647(更改这个数字) ; 接受大数据:在WCF客户端解决 NetTcpBinding binding = new NetTcpBinding(); binding.ReaderQuotas = new XmlDictionaryReaderQuotas() { MaxStringContentLength = 2147483647(更改这个数字) }; 我们即可以使用如上述通过代码配置,我们同样也可以使用配置文件进行配置(在binding节中)。
1 2 3 4 5 6 7 |
public static System.ServiceModel.BasicHttpBinding Binding() { //读取 XML 数据时,超出最大字符串内容长度配额 (8192)。 System.ServiceModel.BasicHttpBinding bing = new System.ServiceModel.BasicHttpBinding(); bing.ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas() { MaxStringContentLength = 2147483647 }; //(更改这个数字) return bing; } |
1 2 3 |
public static API.iClient api = new API.iClient(Binding(), new System.ServiceModel.EndpointAddress("http://192.168.1.11:4417/WebService.svc")); 转自:<a href="http://www.cnblogs.com/Fooo/archive/2012/12/06/2805362.html">http://www.cnblogs.com/Fooo/archive/2012/12/06/2805362.html</a> |
InnerException 消息是“反序列化对象 属于类型 *** 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。(注意细节)
WEB站点在调用我们WCF服务的时候,只要传入的参数过长,就报如下错误: [csharp] view plaincopy 格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: formDataXml。InnerException 消息是“反序列化对象 属于类型 System.String 时出现错误。读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。 第 137 行,位置为 76。”。有关详细信息,请参阅 InnerException。 网上一搜索,答案基本得到解决,可我的问题就是不能解决(主要是细节打败了我),按照网上的文章进行服务器端修改配置如下: [html] view plaincopy <binding name="HttpBinding" <span style="color:#ff0000"><strong>maxReceivedMessageSize</strong></span>="2097152"> <readerQuotas maxDepth="32" <span style="color:#ff0000"><strong>maxStringContentLength</strong></span>="2097152" maxArrayLength="2097152" maxBytesPerRead="2097152" maxNameTableCharCount="2097152" /> <security mode="None"></security> </binding> 其实这里主要的配置是两个:maxReceivedMessageSize、maxStringContentLength; 网上提到还需要配置客户端,其实如果是报上面错误就不要管客户端了,因为如果是客户端调用WCF报错,就不是读取XML数据超时,而是明确的错误提示,如下: [csharp] view plaincopy 已超过传入消息(1024)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性。 所以这篇文章提到的错误基本与客户端无关。 一般情况下,安装上面的修改就可以解决问题了,但是我的WCF还是报错,没办法,只能继续找,无意间发现服务器端WCF配置有点异常,不用登录验证的WCF接口有用到bindingConfiguration,但是需要验证的WCF接口就没有配置该属性,如下代码: [html] view plaincopy <bindings> <wsHttpBinding> <span style="color:#ff0000"><binding name="HttpBinding" maxReceivedMessageSize="2097152"> <readerQuotas maxDepth="32" maxStringContentLength="2097152" maxArrayLength="2097152" maxBytesPerRead="2097152" maxNameTableCharCount="2097152" /> <security mode="None"></security> </binding></span><span style="background-color:#f0f0f0"><binding name="HttpBinding" maxReceivedMessageSize="2097152"> <readerQuotas maxDepth="32" maxStringContentLength="2097152" maxArrayLength="2097152" maxBytesPerRead="2097152" maxNameTableCharCount="2097152" /> <security mode="None"></security> </binding></span> </wsHttpBinding> </bindings> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> <services> <service name="Achievo.MMIP.WMP.WebService.WMPProcService" behaviorConfiguration="wmpWcfBehavior"> <span style="color:#ff0000"><strong><endpoint address="" binding="wsHttpBinding" contract="Achievo.MMIP.WMP.WebServiceIService.WMPServiceProcIService"></strong> </span> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> <service name="Achievo.MMIP.WMP.WebService.WMPGetFormDataService" behaviorConfiguration="wmpWcfFormDataBehavior"> <span style="color:#ff0000"><strong><endpoint address="" binding="wsHttpBinding" bindingConfiguration="HttpBinding" contract="Achievo.MMIP.WMP.WebServiceIService.IWMPGetFormDataIService"></strong> </span> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> 注意红色部分的配置,大伙可以对比一下,就发现其中一个缺少bindingConfiguration配置;如果这个时候,把缺少的部分补上,和另外一个配置一样,WCF就会出错,这里我的初步判断是:name="Achievo.MMIP.WMP.WebService.WMPProcService"是必须要验证登录才能访问,所以不能绑定上面的匿名访问的配置,简单说就是规定是验证就不能在配置为匿名;所以把配置修改为如下: [html] view plaincopy <bindings> <wsHttpBinding> <span style="color:#ff0000"><strong><binding name="HttpBinding" maxReceivedMessageSize="2097152"> <readerQuotas maxDepth="32" maxStringContentLength="2097152" maxArrayLength="2097152" maxBytesPerRead="2097152" maxNameTableCharCount="2097152" /> <security mode="None"></security> </binding> <binding name="HttpBinding1" maxReceivedMessageSize="2097152"> <readerQuotas maxDepth="32" maxStringContentLength="2097152"/> </binding></strong></span> </wsHttpBinding> </bindings> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> <services> <service name="Achievo.MMIP.WMP.WebService.WMPProcService" behaviorConfiguration="wmpWcfBehavior"> <strong><span style="color:#ff0000"><endpoint address="" binding="wsHttpBinding" <span style="font-size:18px">bindingConfiguration="HttpBinding1"</span> contract="Achievo.MMIP.WMP.WebServiceIService.WMPServiceProcIService"></span></strong> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> <service name="Achievo.MMIP.WMP.WebService.WMPGetFormDataService" behaviorConfiguration="wmpWcfFormDataBehavior"> <strong><span style="color:#ff0000"><endpoint address="" binding="wsHttpBinding" bindingConfiguration="HttpBinding" contract="Achievo.MMIP.WMP.WebServiceIService.IWMPGetFormDataIService"></span></strong> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> 在验证,OK,通过。 转自:http://blog.csdn.net/yang_5/article/details/11775819
View Details