Edi Wang

Microsoft MVP for Azure

All Posts

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项目目录里会多一个
ASP.NET Web API

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

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

巧用委托简化重复代码

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

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

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

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 Blob Storage

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

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

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文件夹,在 …
TFS Visual Studio

如何手动将一个普通.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.csproj。细心的观众 …
.NET

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

昨天打算用Windows Azure VM建个FTP来下东西,本来以为只要配置IIS和防火墙再打开Azure Portal的21端口就行的,结果又被Windows Azure爆出了翔。在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端口的,虽然不知道是为什么
IIS VM FTP

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

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