All Posts in 2013


ASP.NET Web API 跨域访问(CORS)要注意的地方

前几天我在帮队友撸一个WebAPI的跨域访问问题,被爆出了翔,今天正好有时间总结一下经验。 首先一个最坑之坑,也是ASP.NET官网上都没有提到的坑,是Web.config里的配置。大家看这个建立WebAPI项目之后,默认的Web.config: 它居然把OPTIONS类型的请求给撸掉了!然而,在jQuery等框架里发起CORS请求的时候,虽然你写的可能是“GET”,但是现在的浏览器是会自动把这个GET先撸成OPTIONS去访问服务的,这也叫“preflight”请求。如果你的服务拒绝OPTIONS这个verb,你会得到一个405的结果(用fiddler就可以看到)。 所以,要让WebAPI支持CORS,第一步就是在web.config里把“<remove name="OPTIONSVerbHandler" /& …


在IIS服务器上安装和配置Web Deploy (WS2008R2)

作为ASP.NET开发者,部署应用到测试或生产环境是家常便饭。不知道大家平时都是怎么部署网站的?手工拷贝文件?FTP?还是高端的package解压?对我来说,最方便的还是WebDeploy,它可以让我从Visual Studio中一键部署网站到IIS服务器,并且智能判断哪些文件是新增的,哪些是需要修改或删除的。Windows Azure Website就默认支持这样的部署方式。但我们不可能一直在公有云上做开发,如果我们想把这样方便的功能带到本地怎么办呢? 经过开荒,我在Windows Server 2008 R2和Windows Server 2012 R2上都成功配置了Web Deploy。目前用的最多的还是WS2008R2,所以我就带大家来看看如何在这款系统上安装和配置Web Deploy。 首先,你需要在IIS上安装管理服务。 在Server Manager(服务器管理)里面, …


Kendo UI for ASP.NET MVC 的一些使用经验

最近的项目里用到了Kendo UI。这货很好很强大,但可惜官方文档组织的并不是很好,有很多配置非常坑,需要自己去发掘。 一、版本 首先,是版本的区别。简单的来说,免费版的Kendo UI是不包含DataViz组件的,即没有图表功能,并且也没有服务端的Helper,比如MVC的wapper,所以,免费版只有js和css,不会给你dll的。 收费版,比如for MVC的这个版本,除了包含dataviz以外,还包含预先定义好的mvc wapper,所以你需要引用dll才能使用kendo的html helper。这些Helper的功能仅仅是生成对应的JS,对于熟悉C#的程序员来说,图个方便而已。不过不得不承认,这些helper的设计是一流的,使用lambda表达式来配置参数感觉非常棒。 总结一下,如果你的团队前端程序员非常碉,你可以使用免费版,但不包含图表组件。如果你是像我一样的屌丝 …


ASP.NET WebAPI 自动生成帮助文档

目前在做的项目里要用到RESTful Service,一开始是用WCF WebHttpBinding撸的,但我知道WebAPI才是最适合的,正好现在VS2013 RTM了,Web API 2也跟着ASP.NET MVC5一起发布了,于是今天就把Service用Web API 2重写了一下。 我选择Web API的一个重要原因就是因为可以自动生成文档,省去了开发人猿不少宝贵的时间。以前在用Web API第一代的时候,自动生成帮助文档的功能默认是不完整的,现在到了Web API 2,这个功能已经通过NuGet包的形式很好的整合到了一起。我们来看一下吧! 首先,用VS2013创建的Web API 2项目会默认带有Microsoft ASP.NET Web API Help Page的包。如果没有,就需要手动去NuGet上安装。 在安装了这个包以后,你的Web API项目目录里会多一个 …


如何让应用程序要求以管理员身份运行(C#)

从Windows Vista开始,为了防止操作系统被恶意软件菊爆,Windows加入了UAC机制,在没有关闭UAC的时候,用户的程序都没有管理员权限去执行。但是如果软件需要做一些操作,比如读写注册表,就需要以管理员身份启动。然而普通用户并不清楚这一点,这有可能导致我们的程序被差评,如果是个妹子,发现你的软件不能用,那你连好人卡都收不到了。 幸好,用.NET开发的程序可以很方便的做到自动要求以管理员身份运行。 首先为了达到演示效果,我需要在程序界面上通知当前环境是不是以管理员身份运行,为此我找了一个UACHelper,这个东西挺实用的,就算不是以管理员身份运行的,也不会在用户面前直接爆掉。 public static class UacHelper { private const string uacRegistryKey = "Software\\Microsoft\\ …


Attribute Routing in ASP.NET MVC 5 翻译及补充

原文:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx 作者:Ken Egozi 翻译:汪宇杰 路由(Routing)指的是ASP.NET MVC如何将一个URL匹配到一个Action上的过程。MVC5(译者注:MVC框架的最新版本,与VS2013一起发布)支持一种新的路由类型,叫做基于特性的路由(attribute routing),正如它的名称所隐含的,特性路由使用特性(译者注:C#的特性标记,如[Serializable])定义路由。特性路由给了你更多的自由去控制Web应用中的URL地址。 早期风格的路由,即基于契约的路由,仍然被支持。事实上,你可以把这两者结合起来。 这篇文章涵盖ASP.NET MVC5特性路由的基本玩法。 为毛用特性路由? …


巧用委托简化重复代码

在C#编程中通常会碰到许多重复劳动的情况,而面向对象编程的原则就是消除这些重复劳动,增加代码重用性。我们虽然有很多基本的模式去做抽象和封装,但还是会碰到一些看似不得已的重复劳动的情况。比如你在写一个数据访问层的类,按照规范,每个方法都需要加try-catch,就像这样: public void Method1() { try { // logic... } catch (DataException ex) { // fuck the ex... } } public void Method2() { try { // logic... } catch (DataException ex) { // …


Windows Phone 8 列表控件(LongListSelector)分组

Windows Phone 8的列表控件天生支持分组,就像人脉应用中的类似,可以快速根据拼音首字母定位。在列表视图中点击分组标题后显示所有的组名,点击组名即可定位到这个组。我们自己开发的WP应用也能做到这样的分组功能,但需要一些额外的代码。下面的例子来自我的一个WP应用,有图有真相: 分组视图: 实现LongListSelector分组其实很简单。 1. 首先,你需要一个分组的助手类,这是一个相对标准的类,MSDN上抄来的: public class Group<T> : List<T> { public Group(string name, IEnumerable<T> items) : base(items) { this.Title = name; } …


Azure Blob Storage 编程简单入门

Microsoft Azure上的Storage服务看起来非常牛逼,它是用来在云端存储数据和文件的服务,比如Azure里的虚拟机就是保存在Storage中的。当然我们可以用Storage做更多的事,比如有些数据并不适合存放在关系型数据库中,就像图片和附件,我们就可以使用Storage服务。 今天介绍的是Storage里的一种,Blob Storage。Windows Azure Storage还有其他两种存储:Table和Queue,但是我只开荒过Blob Storage,所以其他两个就只能以后介绍了。 使用Blob存储首先得建立一个Storage Account,Account中包含的是Container,这类似于文件夹,最后你的文件会存放在Container下,也就是Blob。 它们的关系就像这样(可耻的盗用了一张Azure官网的图片): 一、在Azure管理页面 …


EntityFramework中使用.Include()做饥饿加载可能产生的性能问题

这几天在码新版博客程序,因为文章表字段太多,手贱把几个相关列拆分到了1-1的表中。比如Post 1-1 PostPublish,Post 1-1 PostExtension。但是性能突然比以前差了一点。 和这两张相关表直接交互的是这么一段代码: var query = Repository.Select<Post>().Include(p => p.PostExtension).Include(p => p.PostPublish) .Where(p => p.PostPublish.IsPublished && (authorName == null || …


如何删除TFS上的WorkItem

我们知道,在TFS上万一建错了Work Item是删不掉的。最多把状态设置为Removed不会显示而已。但如果我们想真正删除一个Work Item就需要一些技巧了。 首先,你电脑上必须安装了Visual Studio(这个大部分用TFS的程序员都应该有吧),并且你登录TFS的账户必须是当前Collection的管理员。不然是没有权限删除work item的。 登录TFS后,找到要删除的work item ID,如下图: 然后启动VS的命令行工具 Developer Command,运行下面这条命令: witadmin destroywi /collection:"你的TFS Collection地址" /id:要删除的Work Item ID 等删除确认出来后,然后按“y”确认。就可以成功删除了。


How to Change TFS Server URL in Visual Studio

今天又给大家带来一个实用装逼技巧。这个故事的起因是我无意中发现微软的TFS Service支持URL重命名了,非常牛逼,就像这样: 但带来的问题就是我们需要手动更改以前所有使用这个TFS地址的地方。Visual Studio就是首当其冲的了。很可惜,在VS里面,是没有办法直接编辑TFS地址的。 如果删掉重建的话,还需要把之前所有的本地文件夹都映射一遍,万一玩脱了就爆了。所以还是建议去注册表手动修改。 要修改的位置是: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\TeamFoundation\Instances (如果你用的是VS2010,就把11.0换成10.0) 第一处:定位到原TFS地址的文件夹,把右边的Uri字段改掉。 第二处: 还有有个很阴巴的文件夹,藏在你的TFS文件夹下面,展开TFS文件夹, …


如何手动将一个普通.NET类库转换成可移植类库(Portable Class Library)

可移植类库是.NET程序员装逼的必备良药,至于它有多牛逼,我也不知道,大家可以自己看一下 http://msdn.microsoft.com/en-us/library/vstudio/gg597391%28v=vs.110%29.aspx 但是万一你装逼的时候手一滑,建成了一个普通的Class Library肿么办?普通青年的做法是删掉再建一个,这当然是OK的。但是,作为文艺青年,我们可以继续装逼:自己动手把这个类库转换成Portable Class Library。 为了演示,我先建一个普通的.NET类库:AVeryNBClassLibrary 在这个项目的属性页里面,自然是看不到Portable Class Library的选项的。 接下来,在项目上点右键,选择Unload Project,然后再次右键选择Edit AVeryNBClassLibrary. …


如何在Windows Azure虚拟机上配置外网能访问的FTP服务器

昨天哥被功夫网墙出了翔,一怒之下打算用Windows Azure VM建个FTP来下东西,本来以为只要配置IIS和防火墙再打开Azure Portal的21端口就行的,结果又被Windows Azure爆出了翔(Blow up to shit)。在Azure上配置FTP没那么容易的。 首先,如何安装和正常配置一个FTP我不叙述了,大家可以自己搞定。Azure唯一特殊的就在于开防火墙端口。 1. 你需要知道你VM的外网IP,可以用ping命令,虽然Azure VM不允许被ping,但解析IP还是没问题的。 2. 将IP添加到FTP站点的FTP Firewall Support里面。 3. 由于Data Channel Port是在IIS Root Node上被锁住的,所以还要回IIS Root去配端口范围。这些端口是FTP用来传输数据的(FTP居然不是只用21端口的,虽然 …


Windows 8上IIS8部署WCF服务报错的解决办法

今天被IIS爆出翔了,写了个WCF Service,部署到IIS上,本来觉得是很简单的事,结果爆了: 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.ServiceModel.Activation.HttpHandler”。 由于我的IIS是安装.NET Framework和VS以后才装的,ASP.NET也没装上,所以一般情况下,只需要运行那个众所周知的“aspnet_regiis -i”命令就行了。但是Windows 8上这个命令是爆的。。。 正确的解决办法是,除了在Windows功能-Internet信息服务-应用程序和开发中选择ASP. …


如何在公司Http代理后使用NuGet官方源

有些公司上网使用的是Http代理。默认情况下,VS是无法访问外部网络的。如果要使用NuGet,通常只能在局域网里架一个自己的NuGet服务器。但这种方法不论是package的数量还是更新频率都远远不如官方NuGet。所以有必要想个办法通过代理访问NuGet官方源。 NuGet的官方源地址是:https://nuget.org/api/v2/ 在VS的设置页面中可以配: 确认这个地址无误后,需要手动对VS的两处设置做更改,才能让VS用代理访问外部网络。 首先,关闭VS。打开VS安装目录,比如:D:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE 下的“devenv.exe.config”。 然后修改System.Net节点如下,proxyaddress改成你自己的代理地址。 …


Windows Azure部署NuGet服务器爆掉的解决办法

因为公司网络的限制,没有办法访问NuGet的官方地址 https://nuget.org/api/v2/ 。所以我只能在Windows Azure上搞了个私有的NuGet服务器。本地测试一切正常,但是部署到Azure以后,查看package list的时候爆了: 根据提示,只要更改web.config的一个配置就行: <system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel> 然后在VS中重新部署网站到Windows Azure,因为是差异部署,只需要覆盖web.config就行。很快我们 …


Windows Azure中如何将SQL数据库转移到别的Subscription下

今天本屌丝怀着无比兴奋的心情,去参加了微软在上海举办的Azure训练营活动。又得到了一个Azure账户,并且也感受到了人类的希望。自从用了Azure以后,我逼格提升了,博客服务稳定了,就连三观也恢复了!妈妈再也不用担心HTTP 503了! 拿到新账户以后,我把Co-Administrator交给了我outlook.com上的的主账户。这样我用outlook账户登录,就能看见除了猿来的MSDN Subscription以外的另一个账户了。并且可以在一个账户中集中管理所有的内容,屌炸天了!#微软,人类的希望# 那么,在实际场景中,不同的Subscription可能是不同的人持有的,如果我们想把现有账户中的Azure Service转移到别的账户中,肿么办呢?如果重新部署的话,意味着风险和服务中断。幸好,光荣、伟大、正确的微软已经给我们提供了这么一个选项,能够在几秒内平稳将服务迁移到别的 …


使用PowerShell操作Windows Event Log

PowerShell是个很牛逼的命令行工具,在Windows 7以后的系统里都默认自带。学会了PowerShell就可以提升逼格,让妹子崇拜。今天就教大家用PowerShell操作Windows的Event Log。 首先,启动PowerShell很简单,只需要在开始菜单里输入Power,就能找到了(Windows 8用户可以直接在开始屏幕里搜索Power)。 启动PowerShell后,你可以看到一个这样的界面。和CMD不同,它是深蓝色背景的,并且路径前多了PS前缀。看起来很厉害的样子: 有用程序写过Windows Event Log的童鞋都知道,我们的首要任务是创建一个Log和一个Source。PowerShell里语法如下: new-eventlog -LogName 日志名称 -Source 源名称 比如,我们创建一个Name为Game,Source为CS的 …


[图解]TFS2010升级到TFS2012

TFS2010无法通过安装包自动升级到TFS2012,必须手动完成,要升级TFS2012,首先得满足这几个条件: 1. TFS2010必须安装SP1 2. SQL Server 2008 R2必须安装SP2 不过,不管你升级的TFS2012是中文版还是英文版,TFS2010的语言可以任意。 升级的步骤如下: 1. 在TFS2010的管理控制台中,打开“团队项目集合”,然后选中你要迁移的项目集合,在界面下方点击“分离集合”。 2. 在弹出的向导中输入你的备注 3. 一切检查就绪,可以忽略那个警告。 4. 点击“分离”,等待操作完成。 5. 为了保险起见,建议备份TFS的数据库。数据库为TFS_Configuration和你的项目集合数据库。 6. 接下来就可以卸载TFS2010,然 …


图解:如何将SQL Azure数据库备份到本地SQL Server

用了两天SQL Azure后,发现SQL Azure数据库没有办法做传统意义上的“bak”备份,但我们确实很需要能够随时将数据库备份到本地,以更灵活的使用。所以今天就开荒了一下操作方法,并分享给大家。这样一来,我们既可以把SQL Server迁移到SQL Azure,又可以反过来把SQL Azure撸回SQL Server,这是一个比较完整的装逼过程,妹子们一定会赞不绝口。 步骤如下: 1. 启动SSMS2012,在目标SQL Azure数据库上点右键,选择“Export Data-tier Application”。 2. 在Export Settings选项卡里制定本地的备份路径,现在已经是“bacpac”拓展名的了。。。 3. 然后点击Next,确认后就向导就开始撸了。 4. 撸完以后会显示 …


图解:如何将SQL Server数据库迁移到SQL Azure

最近为了进一步装逼,决定将本博客的数据库从SQL Server 2008 R2迁移到Windows Azure上,即SQL Azure,云数据库。今天花了半天时间成功完成了迁移,把经验拿出来给大家分享。 注意:本文的方法只在SQL Server 2008 R2和SQL Server 2012数据库上试过,其他版本生死未卜。 首先,不管你现在的数据库是MSSQL2008R2的还是MSSQL2012的,你都需要安装SQL Server 2012版的SSMS。这是最方便的迁移方法。如果不想用SSMS,可以试试codeplex上的这个工具:http://sqlazuremw.codeplex.com/ 1. 启动SSMS后,在要被迁移的本地数据库上点右键,选择Tasks - Deploy Database to SQL Azure... 2. 在弹出的向导中,点击Connect,连接到 …


[图解]VS2012在Surface RT上远程调试App

最近蛋疼,所以废话不多,直接切入正题。首先这次要说的是Surface RT,是RT版的,ARM处理器的,别弄错了。我们要做的是把工作机上写好的程序放在Surface RT远程调试,而不是在本机和模拟器中运行。 第一步,在Surface RT上安装微软官方的debugger:http://go.microsoft.com/?linkid=9810474 这个debugger是桌面环境下运行的,安装的时候需要管理员权限。 装完以后,开始屏幕上会出现这两个图标,我们要用的是第一个:Remote Debugger。 启动Remote Debugger,正常情况会让你配一些Windows防火墙,你可以完全按照向导来,最终会出现一个Monitor对话框,证明debugger已经在监听连接了。 接下来有个比较有技巧的地方,如果你的Surface RT上的当前用户和开发程序的机器的登 …


Force Visual Studio Always Run As Administrator

If you are doing ASP.NET development that requrie your project bind to IIS, you will need to open Visual Studio every time as Administrator, which is annoying.  However, there's a way to make Visual Studio run as Administrator by default every time without shutting down UAC on your system. 1. Find your Visual Studio install path For example, I am using Visual Studio 2017.3 Preview, so my …


How to enable IPC share on Windows 8/8.1/10

Update 2017.2: This will also work with Windows 10 最近为了贯彻微软先进思想,给台式机换了个Windows 8,许多地方爆出了翔,但用惯以后还是很舒服的。在Windows 8里,操作系统的许多设置被微软在黑暗中偷偷的改过了。比如局域网共享文件夹,在以前版本的Windows上,如果知道对方机器的管理员帐户密码,就可以在路径后面加上“盘符$"来直接访问对方的整个硬盘。比如在:\\DiaosPC\D$,系统会弹出一个身份验证对话框,输入DiaosPC上的管理员帐号后,即可访问他D盘的内容。在Windows 2000的年代,黑客们可以利用这点进行“空连接”攻击,给对方下载木马,然后用at命令定时执行,这些黑暗的历史就不告诉大家了。。。。 然而,这个功能在Windows 8上似乎被撸掉了,虽然在管理工具里还能见 …


代码合并工具Beyond Compare的使用技巧

平时做代码合并(Merge)的时候,TFS有时不够牛逼,需要手动合并,经常使用的工具是Beyond Compare。哥今天给大家介绍一下一些加快工作效率的小技巧。 首先,在Beyond Compare 3里,因为整合了资源管理器菜单,所以可以直接选中两个文件夹进行比较,而不用打开软件手动选路径。如果两个文件夹不在同一目录下,也可以分两次选择。 在打开比较视图后,一定记得点下这个按钮,才会做到真正的逐文件扫描。不然默认情况下是快速比较的。 比较完成后,我们可以设置一个过滤器,过滤不需要合并的文件。比如,在.NET项目下,VS的user文件、VSS和TFS的版本控制文件、Bin、Debug等目录都可以忽略。就可以在过滤器里这样设置。如果你不希望每次做代码合并都设置一次过滤器,只要在左下角选择“也更新会话默认值”就OK了。 在代码合并的过程中,通常有新 …


如何让Surface RT的开始屏幕显示4行磁贴

昨天Surface RT启动后,开始屏幕突然变成了4行磁贴。虽然感觉比较惊讶,蛋说实话,4行还是比3行的可用性高一点。不过重启Surface以后,就还原成3行了,怀疑这是Windows判别显示器大小时候的一个bug。 经过一番研究,在Windows 8(Windows RT)上,开始屏幕显示多少行磁贴,是由Windows自动决定的,主要取决于屏幕分辨率以及屏幕大小。在Surface的1366x768、10.1,10.6寸屏上,默认显示3行,并且不提供设置选项。 不过,1366x768的分辨率在较大的屏幕上(14.1、15.4寸),是可以显示4行磁贴的。在其他分辨率的设备上,也是如此。但是Windows没有提供手动设置的地方,所以我们只能改注册表强撸。 下面的注册表设置,只适合Surface RT,Windows 8(非RT)用户请勿尝试,小心灰飞烟灭。 Windows …


开荒成功:如何在Surface RT上给其他计算机共享文件

最近在撸Surface,屌丝只能买RT版的,上面的Windows 8不是全功能的,你们懂的。对我来说,比较不方便的就是似乎不能共享文件。当然,用Surface访问我台式机上的共享一点没问题。所以今天开荒了一下如何在Windows 8 (RT版上)架设共享文件夹。 1. 在服务管理里面,找到Server,并设置为自动启动,然后启动这个服务。 2. 运行mmc.exe(服务器管理员猿应该经常用这个吧) 3. 将“共享文件夹”添加到右边的管理单元里。 4. 现在你就可以添加你要共享的文件夹了。注意权限设置一定要正确,符合自己的需要。 5. 用局域网中的其他电脑访问你的Surface的机器名,应该能看到共享了!


VS2012高亮显示当前行背景色的问题

在VS2012中,如果你不幸用了三方主题,尤其是深色主题。比如http://studiostyl.es/schemes/son-of-obsidian ,那么你很可能发现当前行高亮的样式变成了这样: 外面多了个丑陋的白色边框!但VS2012自带的dark主题却没有这个问题。 研究了许久,发现一种比较2的办法可以解决,不知道是不是VS2012的Bug。只要在颜色设置里(Environment, Fonts and Colors),把高亮当前行(Highlight Current Line)前景色和背景色都设为一样的就好了: 虽然在Sample里你看不到文字,但保存设置以后,回到VS,一切都是正常的了: 另外,如果你不想要这个高亮当前行的功能。可以在Text Editor, Display里取消勾选"Highlight Current Line":