Edi Wang

All Posts 284


ASP.NET MVC @Html.MenuLink for Bootstrap

Bootstrap是目前流行的前端装逼框架,可惜ASP.NET MVC没有现成的Razor HTML Helper来做导航栏按钮(链接),一个很常见的需求是导航栏按钮根据当前的controller,action加上高亮。 在bootstrap的HTML里定义如下: 我们自定义一个Helper就能生成这样的HTML: public static MvcHtmlString MenuLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string[] highlightedActionNames = null) { var currentAction = htmlHelper.ViewContext.RouteData.GetRe...

MVC Razor Bootstrap

简单粗暴有效解释ASP.NET中的线程池是怎样处理Http请求的

自从有了.NET 4.5,我们又多了一个装逼语法:async,await。但如果错用就会装逼不成反变傻逼。首先我们得明白在ASP.NET中async await所针对的问题,这样才能正确的装逼。于是我们就不得不先研究一下线程池。 在IIS服务器上,处理Http请求的是线程,和Windows的其他软件一样,干活的永远是线程,而不应该说是进程。一个线程同时只能处理一个request,而web上的request不可能同时永远只有一个,所以线程需要和他的小伙伴们一起组成线程池,才能保证网站的响应。当一个线程处理完了手头的请求,它就被释放掉了,于是如果再有新的请求进来他就能再去处理。但如果当线程用完了,并且他们正在处理的请求都没完成,网站就卡住了,用户就只能等出翔。这时候IIS就会返回一个HTTP 503爆给用户。 打个比方,IIS服务器就好像银行,Http请求就好像顾客,银行开的窗口数量就是进...

IIS async await Thread

我在《上海轨道交通》应用中是如何解析XML数据的

本文针对.NET初学者介绍LINQ TO XML,你会看见很多为了通俗易懂而故意描述得不专业的语句,所以高手勿入!本文介绍的方法不只针对WP,其他任何.NET项目也可以参考。 我在Windows Phone平台上发布的《上海轨道交通》使用的是离线XML作为数据存储。好处是不需要安装任何三方库,.NET自己就有能力解析。如果用JSON装逼还得下载JSON.NET呢。又因为都是只读数据,也用不着为了装逼而用SQL Lite或SQL CE什么的数据库杀鸡用牛刀。 下面介绍一下如何在工程里内嵌XML文件并解析到对象的一般方法。 《上海轨道交通》的XML文件保存的是所有的站点信息,单个节点看起来就像这样:...

LINQ XML WP Shanghai Metro

Windows Phone 8 开发:地图应用测试正常发布后爆掉的解决办法

最近更新了一次我的《上海轨道交通》App,结果爆了。为了加入街区图功能我用了WP自带的Map控件,并且也申请了正确的API Key,发布之前在模拟器和真机上测试一切OK,结果发布后就是这个样子的: 具体的异常信息是: Cannot create instance of type 'Microsoft.Phone.Maps.Controls.Map' [Line: 84 Position: 38]Exception from HRESULT: 0xD0000022 根据之前的经验,这像是没有在AppManifest中打开需要的权限。可是我分明已经勾选了ID_CAP_MAP了,还需要什么权限呢?最后经过一番苦逼的研究,在MSDN上看到了这样一个警告: 你TM在逗我?VS居然在我部署测试程序的时候偷偷把这个capability选上了而不告诉我一下!我的App设计的目的就在于尽量不...

WP Map

Live to Code: Windows Phone开发,让我感受不一样的天地

本文首发于大微软Live to Code活动官网:http://www.microsoft.com/china/livetocode/91.html 我是一个疯狂的软粉,也是微软产品十几年的老用户,2012年毕业参加工作之后接触到了许多微软的前沿技术,对微软产品更加爱不释手。在用Windows Phone以前,我用的是一款中端的Android手机,Android系统虽然软件丰富多样,但它非常耗电,系统也经常卡得受不了,还中过两次毒,于是忍无可忍之下我换了一部诺基亚720,终于凑齐了微软的三个代表:Surface,Office和Windows Phone。 其实我的主要工作是开发ASP.NET网站,自己的博客(diaosbook.com)也是一路走来从WebForm 2.0维护到现在的MVC 5.1,然而相比ASP.NET开发,WP让我感觉更贴近普通用户。开发免费、无广告、注重界面和交互...

MSDN WP Microsoft

VS2013连接TFS报错Key not valid for use in specified state解决办法

前不久我的VS2013突然爆了,连接TFS的时候报错"Key not valid for use in specified state",就像这样: 经查,这是微软的产品bug。具体表现为:一旦你修改了登录密码(不管是本地账户还是域账户),VS就再也连不上TFS了。目前微软没有针对这个问题的补丁。临时解决方法如下: 打开注册表,转到“[HKEY_CURRENT_USER\Software\Microsoft\VSCommon\12.0\ClientServices\TokenStorage]”,把整个“TokenStorage”节点删掉。 重启VS2013,这时候会要求你再次输入TFS的身份信息,就OK了。 太坑爹了。...

TFS Visual Studio

Windows Phone 8 开发:应用崩溃时给作者发送错误报告邮件

我们的应用难免会爆,但是手工在各个方法上加try...catch...未必能cover到所有场景,有时候我们不希望应用吞掉错误,发生严重异常时,我们应当允许应用在用户面前爆掉。如果没有处理这些异常,应用程序的表现就是闪退。比较好的做法是在应用崩溃时给用户一个选择是否发送邮件告诉应用作者崩溃的详细日志。对于作者来说,等待DevCenter的异常报告相对而言比较被动。如果能在应用崩溃之后立即得到回馈那就可以尽早修复问题。 做法很简单,和ASP.NET网站在Global.asax中使用的全局错误处理类似,WP应用也有个全局错误处理的事件。 打开App.xaml.cs,定位到Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)事件处理函数上。 当任何未处理的异常产生时...

WP Exception

Windows Phone 8 开发:如何判断用户手机是否更新了GDR3

有时候我们开发的软件需要用到GDR3更新的功能,比如调用屏幕旋转的设置之前就先得确定用户已经安装了GDR3。但是WP SDK没有提供直接的方法,所以我们只能通过判断操作系统版本号来确定用户的系统是否安装了GDR3。 GDR3的特征是:系统版本号大于8.0.10492(Developer Preview包含在内)。在手机的关于页面中可以看到当前版本号,安装了GDR3的通常是8.0.10512: 所以,判断GDR3的代码如下: static bool IsGDR3() { return Environment.OSVersion.Version = new Version(8, 0, 10492); } 下面是有图有真相环节: MessageBox.Show(IsGDR3() ? "This Phone has GDR3 installed" : "This P...

WP GDR3

在Microsoft Azure上搭建SSTP VPN

2017.5更新:本文根据最新版Azure修改,方法仍然管用,但是目前更好用的方法是使用http://www.softether.org/ 的VPN,Azure也能搭,然而为了不被喝茶,我无奈不能在博客上公开他的使用方法,大家可以按照官网文档自己探索。 注意,本文的方法不适用于国内世纪互联运营的Azure,首先,国内Azure的网络也是在那个啥之后的,本身就不能访问Google什么的,而且,如果你试图在国内Azure上搞VPN,会接到喝茶电话的,不要问我怎么知道的…… 一、服务器设置 1. 创建虚拟机 我选择Windows Server 2016,Size 建议选1.75G内存以上的机器,比如A1 Standard   在Network security group设置里一定要打开TCP 443端口   创建完成之后,一定要分配一个DNS name进去...

VPN Azure SSTP

如何把基于事件的异步方法包装成基于Task的async方法

自从有了.NET4.5,我们又多了一个装逼语法:async/await,可以写出优越感然后进一步鄙视Java。然而,有时候一些老的API只提供了基于事件的异步方法,没有提供返回Task的异步方法,影响我们的逼格,怎么办呢?就像Windows Phone 8的webclient,只提供了基于事件的DownloadStringAsync方法,写的时候就像这样:var client = new WebClient(); client.DownloadStringCompleted += (s, e) = { ... }; client.DownloadStringAsync(...);为了保住我们的逼格,大微软早就为我们提供了解决方法:TaskCompletionSource,非常适合把基于事件的异步封装成Task方法。这个类型返回是一个可以被await的Task,事件callbac...

.NET async await