[转载]发布一个原创小类库:.Net 小型软件自动更新库(SimpAutoUpdater)

mikel阅读(937)

[转载]发布一个原创小类库:.Net 小型软件自动更新库(SimpAutoUpdater) – 随风飘扬 – 博客园.

本类库+工具用于快速实现一个简单的自动更新程序,旨在快速简单地为现有的.Net应用程序添加上比较简单的自动更新功能。

在发布应用程序时,我们经常会需要给自 己的程序加上自动升级功能。.Net Framework自带的ClickOnce中有自动升级的功能,但是往往不太好用,比如必须用ClickOnce发布,安装的文件夹一个版本一个等等, 我们会想要一个比较简单、甚至绿色软件也能使用的自动升级功能,这个自动升级程序就是基于这个目的而制作的。

为了让使用起来更加简单快捷,我对内置的功能进行了大幅度的精简和集成,最简单的情况下只需要你只需要一行代码即可实现自动更新,如下所示:

  1. FSLib.App.SimpleUpdater.Updater.CheckUpdateSimple(http://ls.com/update.xml);

概述

本类库+工具用于快速实现一个简单的自动更新程序,可以简单地完成小型应用程序的快速更新。

整个工具分成两部分,一部分是供用户使用的类库,一部分是用于生成更新包的工具。

基于 .Net 3.5 开发,原则上最好安装有此版的 .netFramework。特殊情况下,可以仅安装 .Net Framework 2.0SP1,发布的时候附带上 System.Core.dll 即可正常运行。

整个自动升级工作的流程

2d70e14a-d474-4b75-a12a-562d2bce7b74

更新包生成工具

作为一个简单的升级需求,不需要很复杂的设置。

1de73525-2e99-4160-9e62-e71b2694b198

需要填写如下信息:

  1. 应用程序名
  2. 当前的版本(也就是更新后的版本)
  3. 发布地址可选(如果填写了,在更新提示框上会有个链接可以链接到这个网址)
  4. 新程序目录(选择最新版本程序的发布目录)
  5. 升级包路径:选择一个路径用来保存升级包(*.zip),同时自动更新信息 *.xml 也会保存在这个目录下
  6. 更新前执行:在下载完成、即将安装更新前会执行这里选择的程序。这里有点BUG一旦选择了就不能取消,所以请注意下;
  7. 更新后执行:在安装完成后、即将退出前执行的操作。需要注意的BUG同上。通常选择需要运行的主程序。
  8. 执行时间限制:用于限制6中选择的程序的执行时间,超过设置的时间后进程将会被强行结束。
  9. 更新说明:用于提示更新的时候显示的文本消息内容。
  10. 创建:按照填写的信息生成升级包
  11. 打开:打开一个已有的升级信息文件,用于下次更新版本时直接修改信息即可,其它的不需要变化。

发布更新包

更新包应该发布到服务器上。生成的文件有两个,一个是压缩包(*.zip),一个是信息文件(*.xml),两个应该一起发布。这里假定通过网址 http://ls.com/update.xml 能访问到生成的 update.xml 文件。

为应用程序添加自动更新功能

注意:自动升级程序取当前程序文件的版本,是以当前运行的程序集版本作为识别依据的。

首先在VS中为当前的主程序项目添加引用,引用“客户端”中的“SimpleUpdater.exe”。

在VS中,点开“解决方案管理器”中相应项目的“属性”节点,打开 AssemblyInfo.cs 文件,在最下面添加上一行自动更新声明:

这步是必须的,否则请求检查更新时会抛出异常;代码中的网址即上面提到的能访问到xml文件的网址。

如果您希望更加简单的使用而不用去加这样的属性,或者您想程序运行的时候自定义,您可以通过下列方式的任何一种方式取代上面的属性声明:

  • 使用 FSLib.App.SimpleUpdater.Updater.CheckUpdateSimple(“升级网址”) 的重载方法。这个重载方法允许你传入一个升级包的地址;
  • 在检查前手动设置 FSLib.App.SimpleUpdater.Updater.UpdateUrl 属性。这是一个静态属性,也就是说,您并不需要创建 FSLib.App.SimpleUpdater.Updater.UpdateUrl 的对象实例就可以修改它。

无论使用哪种方式,请确保在检查更新前,地址已经设置。

到这里,准备工作即告完成,为代码添加上检查更新的操作即可。

  1. static class Program
  2. {
  3. /// <summary>
  4. /// 应用程序的主入口点。
  5. /// </summary>
  6. [STAThread]
  7. static void Main()
  8. {
  9. Application.EnableVisualStyles();
  10. Application.SetCompatibleTextRenderingDefault(false);
  11. var updater = FSLib.App.SimpleUpdater.Updater.Instance;
  12. //当检查发生错误时,这个事件会触发
  13. updater.Error += new EventHandler(updater_Error);
  14. //没有找到更新的事件
  15. updater.NoUpdatesFound += new EventHandler(updater_NoUpdatesFound);
  16. //找到更新的事件.但在此实例中,找到更新会自动进行处理,所以这里并不需要操作
  17. //updater.UpdatesFound += new EventHandler(updater_UpdatesFound);
  18. //开始检查更新-这是最简单的模式.请现在 assemblyInfo.cs 中配置更新地址,参见对应的文件.
  19. FSLib.App.SimpleUpdater.Updater.CheckUpdateSimple();
  20. /*
  21. * 如果您希望更加简单的使用而不用去加这样的属性,或者您想程序运行的时候自定义,您可以通过下列方式的任何一种方式取代上面的属性声明:
  22. * 使用Updater.CheckUpdateSimple 的重载方法。这个重载方法允许你传入一个升级包的地址;
  23. * 在检查前手动设置 FSLib.App.SimpleUpdater.Updater.UpdateUrl 属性。这是一个静态属性,也就是说,您并不需要创建 FSLib.App.SimpleUpdater.Updater.UpdateUrl 的对象实例就可以修改它。
  24. */
  25. FSLib.App.SimpleUpdater.Updater.CheckUpdateSimple(“升级网址”);
  26. Application.Run(new Form1());
  27. }
  28. static void updater_UpdatesFound(object sender, EventArgs e)
  29. {
  30. }
  31. static void updater_NoUpdatesFound(object sender, EventArgs e)
  32. {
  33. System.Windows.Forms.MessageBox.Show(“没有找到更新”);
  34. }
  35. static void updater_Error(object sender, EventArgs e)
  36. {
  37. var updater = sender as FSLib.App.SimpleUpdater.Updater;
  38. System.Windows.Forms.MessageBox.Show(updater.Exception.ToString());
  39. }
  40. }

结束

详细的代码请参考附带的示例项目。

检查到更新时窗口如下:

28bfbc14-2a3d-49bb-9092-d913a1399d62

这之后的更新操作都是全自动执行的,不需要在主程序中有任何其它操作。

下载

库直接下载链接:http://www.u-tide.com/fish/Service.asmx/Download/33/28

发布页面:http://www.u-tide.com/fish/soft/simple_autoupdater/index.html

简单使用说明:http://www.u-tide.com/fish/soft/simple_autoupdater/usage.html

如果有问题或建议,请回复此日志,到讨论区反馈: http://www.u-tide.com/fish/Discussion.asmx/Index/33

[转载]VS2010测试功能之旅:编码的UI测试(1)

mikel阅读(1525)

[转载]VS2010测试功能之旅:编码的UI测试(1) – RealDigit – 博客园.

前言

研究VS2010的自动化测试有一段时间了,在研究的过程中,发现网上的VS2010相关的测试资料十分稀少,这给学习带来比较大的困难。幸运的是,自己因为常用QuickTest Professional做自动化测试,并且对.Net代码比较了解,使得在学习的过程中并不是特别困难,对UI CODED TEST也已经有一定了解。本着与大家交流,共同进步的想法,思考之后,决定写这些随笔,来对VS2010的测试功能做一些探索和总结。希望大家能够多多指教!

自动化测试

自动化测试指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。

自 动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测 试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。

VS2010编码的UI测试,属于自动化测试中的一种,它可测试应用程序的用户界面是否功能正常。 编码的 UI 测试对应用程序的用户界面控件执行操作,并验证是否以正确的值显示了正确的控件。

一个简单的示例

在上面对于自动化测试的介绍中已经提到,编码的UI测试将对应用程序的用户界面进行操作之后进行验证,对于界面的操作,我们需要预先录制或者直接编写(日后会介绍直接编写的方式),在这个简单的实例中,我们将先使用录制进行操作,录制完毕之后,使用回放功能进行回放(类似于录音机,录制之后再播放)

一.新建测试项目

1. 首先打开VS2010,选择测试à新建测试

2. 选择编码的UI测试,简历一个UI测试,名称为CodedUITest1.cs

3. 创建完成,我们可以看到创建之后,项目的目录结构如下

下面做一个简单的介绍

Solution Items:存放该解决方案中各个测试项目公用的设置

Local.testsetings文件和TraceAndTestImpact.testsettings是对解决方案中的测试进行整体上的设置,这个是建立测试解决方案的时候默认自动建立的两项,一个用于运行,一个用于调试,当然这两项是可以删除的,testsettings类型文件可以通过右击Solution Items的时候点击添加新建项建立

TestProject1.vsmdi是用于对项目中创建的测试method进行组织和管理,让其能组织成流程线,一个个进行测试

TestProject:我们刚才建立的测试项目,可以看到刚才建立的UI测试CodedUITest1.cs

二.录制程序并回放

1. 假设我们现在有一个程序(这个示例程序在文章末尾有提供地址),现在我们需要对系统登录的部分进行测试,正确的用户名为”Admin”,密码为”123456”

测试的内容是:

(1).输入错误的用户名或输入错误的密码,检测系统是否提示“用户或密码错误”

(2).输入正确的用户名和正确的密码,检测系统是否提示“登录成功”

程序的截图如下所示:

2. 现在我们可以开始进行录制,将刚才的测试内容录制成实际的操作

3. 点击确定之后,可以看到屏幕的右下角弹出一个UI测试生成器,点击录制之后,就可以进行操作了

4. 之后首先输入错误的用户名和密码,然后点击登录,之后弹出提示框“用户名和密码错误“

5. 这个时候我们可以在录制面板点击暂停录制,然后点击”生成代码“,并将刚才的操作放入方法InputErrorUidPwd中(至于生成后的代码被放在了哪,现在可以先不用关心,最后我会进行说明)

6. 这个时候点击录制面板上的准星(这个时候准星已经Enable了),并一直按住鼠标不放,将鼠标拖到刚才的弹出框上面的文字再松开,然后测试生成器的对象库窗口会自动弹出,VS2010将捕获弹出框上的label对象,如下图所示:

7. 现在我们要进行第一个验证,就是验证这个弹出框用户名或密码错误!是否弹出来了,如果是,则测试通过,如果不是,则失败,接着先前的步棸,首先要确认左边的列表中“UI用户名或者密码错误Text“对象选中,之后选择右边的列表中的Exists属性(该属性表示label是否存在,存在则是True,不存在则是false),点击添加断言

然后弹出为Exists添加断言的窗口,这里我们需要选择AreEqual,比较值是True,表示我们断言用户名或密码错误这个label存在,如果运行测试的时候该label确实存在,则该测试步骤是通过的,否则就是失败

之后点击录制面板的生成代码,为刚才添加的断言生成方法AssertErrorWindow()(至于生成后的代码被放在了哪,现在可以先不用关心,最后我会进行说明)

8. 然后我们继续开始录制,录制开启后,首先点击“用户名或密码错误“弹出框的确定,然后用上面介绍的同样的方法,输入正确的用户名和密码,判断弹出框是否为登录成功,分别添加InputRightUidPwd()操作方法和AssertRightWinow()断言方法,最后便可以录制结束

9. 之后我们可以点击运行来进行测试

之后VS2010会自动操作刚才演示的程序的登录窗口,然后报告测试结果

三.如果现在程序发生异常

假设现在刚才的示例程序,本来输入错误的用户名或密码,应该弹出提示“用户名或密码错误”,现在因为开发人员一时疏忽,不慎将提示改成了乱码“咪asd阿什顿”,那么是否刚才录制的测试能够把这个测试出来呢?我们现在可以试试(这个错误的示例程序在文章最后也提供下载)

开始运行测试

最终不负我们所望,错误还是被测试出来了

四.录制生成的代码被放在了哪里?

首先我们再看看项目的文件结构

可以发现刚才录制之后,VS2010自动生成了UIMap.uitest文件,我们自动生成的代码就放在UIMap.Designer.cs

进入去查看,可以看到刚才录制为我们自动生成的四个方法InputErrorUidPwd()AssertErrorWinow()InputRightUidPwd()AssertRightWinow(),展开之后可以看到详细操作

而在CodeUITest1.cs文件中,也自动添加了几句代码,调用UIMap中录制的测试操作

演示中提到的示例程序

说明:RightDemo.exe是演示中使用的没有问题的程序,ErrorDemo.exe是演示中故意修改提示为乱码的那个示例程序

下载点我

[转载]jQuery:动态改变html表单的目标页(Target)

mikel阅读(1100)

[转载]jQuery:动态改变html表单的目标页(Target) – 努力,天赋,笑容,自信 – 博客园.

1、问题来源

“页面中有一个form,有些个submit按钮或者链接按钮需要点击后打开新页面。我们如何让这些个按钮将表单信息提交到正确的对应页面?”

这个问题看上去很简单。

熟悉ASP.NET开发的都应该很清楚,通过ASP.NET webform,我们可以对runat=”server”的form进行属性设置:

<form method="post" action="default.aspx" id="form1">

如你所知,method属性是http数据传输方法,action属性是要提交的目标页,至于打开新页面,设置target为_blank即可。

对于通常的页面交互,一个或多个按钮提交一个相同的表单这样做没有问题,可是如果按钮需要post的页面不尽相同,这个方法就显得无能为力。因为这种解决方法是“全局”的,设置一次,影响所有表单提交元素。

2、runat=server的form

到这里,也许有人会“幸灾乐祸”地说这都是web form的form机制不好,一个页面只能有一个runat=server的form。我们完全可以在一个页面中多定义几个form,对于不同的提交按 钮,我们给它设置不同的form(即分割提交按钮到不同的表单),这样不就解决问题了吗(新浪、网易和搜狐等很多页面,打开一个网页并查看源码可以看到很 多form,我估计都是这么用的)?

但是,这不是web form独有的“错”,其他开发框架也有类似问题:

Although this discussion uses ASP.NET WebForms as an example, realistically this is a general HTML problem although likely more common in WebForms due to the single form metaphor it uses. In ASP.NET MVC for example you’d have more options by breaking out each button into separate forms with its own distinct target tag. However, even with that option it’s not always possible to break up forms – for example if multiple targets are required but all targets require the same form data to the be posted.

原文的评论中一个哥们回复说:

“Good post, as always, but have you noticed that literally everything you want to do with webforms requires a hack or workaround? It’s always some rudimentary thing that is easy to do in any other web platform or framework, but the webforms abstraction always rears it’s ugly head. Bleh, the further I get away from webforms, the more productive I have become.

”ugly“一词用的真是形象且险恶。好在Rick及时回复说:

# re: Changing an HTML Form’s Target with JQuery
by Rick StrahlFebruary 03, 2011 @ 12:00 am @Jeff – this isn’t specific to WebForms as I pointed out at the top of the page. The same applies to MVC or any other framework that has multiple POSTable options for submission. Admittedly, with WebForms your options are more limited as you can’t easily add additional forms, but when you need to submit form variables to multiple target actions there are no choices regardless of platform…

还有,我感觉回复者Jeff这个名字挺有喜感的。

3、简单实用的解决方案

(1)、直接使用linkbutton或者链接控件?

通常情况下,我们很容易想到用现成的link控件的属性来实现页面提交。比如LinkButton吧:

  <asp:LinkButton runat="server" ID="btnNewTarget" Text="New Target" 
                     target="_blank"  OnClick="bnNewTarget_Click" />

虽然LinkButton没有Target属性,但是像上面那样设置也没有问题。

但是,最怕的就是这个但是。在查看生成的html源码的时候:

<a id="btnNewTarget" target="_blank"    href="javascript:__doPostBack(&#39;btnNewTarget&#39;,&#39;&#39;)">New Target</a>

我们发现生成的html源码里a元素的href属性已经被设置了一段让人眼熟的控制回发脚本。就是这一段脚本,让我们提交数据到新窗口的目的落空。为什么呢?

What happens with a target tag is that before the JavaScript actually executes a new window is opened and the focus shifts to the new window. The new window of course is empty and has no __doPostBack() function nor access to the old document. So when you click the link a new window opens but the window remains blank without content – no server postback actually occurs.

原文解释的还算清楚简单,good,fabulous,excellect…词穷。

(2)、为这些个按钮设置form的Target吧!

通过下面的脚本,可以轻松实现我们的预定功能:

    $("#btnButtonNewTarget,#btnNewTarget").click(function () {
            $("form").attr("target", "_blank");
        });

对于同一个页面post(示例中是default.aspx页面),它和(1)的效果截然不同。可能您习惯要问为什么,原文是这样解释的:

So why does this work where the target attribute did not? The difference here is that the script fires BEFORE the target is changed to the new window. When you put a target attribute on a link or form the target is changed as the very first thing before the link actually executes. IOW, the link literally executes in the new window when it’s done this way.
By attaching a click handler, though we’re not navigating yet so all the operations the script code performs (ie. __doPostBack()) and the collection of Form variables to post to the server all occurs in the current page. By changing the target from within script code the target change fires as part of the form submission process which means it runs in the correct context of the current page. IOW – the input for the POST is from the current page, but the output is routed to a new window/frame. Just what we want in this scenario.

看原文这里可能有点绕人,解释太多,有点抓不住重点。我认为关键要理解原文中的“表单提交进程(form submission process)”。点击按钮的时候,在当前页面通过脚本改变表单的Target,这只是表单提交进程的一部分(By changing the target from within script code the target change fires as part of the form submission process)。

那么真正的“表单提交进程”发生了什么呢?顺着原文的意思,看上去好像是新页面打开,前一页的表单数据提交到新打开的页面,貌似是前一页 (current page)的_doPostPack函数“跳”到当前新打开的页面(也叫current page)触发ClickHandler……不就是“current page”的置换吗?可能我自己的理解现在还有偏差,英语水平下降得令人抓狂,必须要补补了。如果您有更合适的好理解的解释说明,请不吝赐教。

多说一句,点击前一个页面,在新打开的页面触发事件。我kao,这多像江湖中传说已久的乾坤大挪移啊?

By the way,我们还可以在不同的新页面中post传参,您可以将demo中的Default页面的form的action设置为 “TargetPage.aspx”试一下。其实我自己在开发中也曾经碰到过Rick文中所述的类似问题。我的解决方法通常都是对于某一个按钮,直接通过 JavaScript写个函数:先找到要操作的form,修改action,然后调用form的submit方法打开新窗口,真不如Rick原文中的来得 简洁。

demo下载:SimpleWebApp

[转载]构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(上篇)—识别性能瓶颈

mikel阅读(935)

[转载]【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(上篇)—识别性能瓶颈 – ASP.NET 架构 – 博客园.

前言:从本篇开始就真正的进入了性能调优的阶段,在之前的文章中提到了页面加载过慢的四个性能问题,其中第一个问题就是:服务端解析.aspx页面的时间过长,本篇就分析这个问题,给出一些方案,因为涉及到的问题很多,的在后续文章会逐个详细介绍。

因为本篇的篇幅过长,所以划分为了多篇。

本篇的议题如下:

识别和分析服务端的性能瓶颈()

内存

缓存

CPU

处理请求线程

提高性能的一些改进措施(下)

部署优化(前篇)

不必要回传(中篇)

不必要的请求(后篇)

在服务端有很多可以优化的地方,优化的话题也很多,在本篇中我们主要关注:如果让服务端更快的生成页面,同时也关注如果更快的让生成的页面更快的到达客户端浏览器。

其实我们就是在优化下面的时间线:

要缩短上面的那条时间线,就需要服务端更好的利用它的资源,例如更好的利用和分配内存资源,CPU资源等。如何好的充分利用这些资源,一定程度上与我们写的代码的质量息息相关,一段好的,高效的代码往往可以让我们少花钱去更多的硬件设备(所以代码的质量非常重要)。

下面我们就来看看服务端一般可能出现的性能瓶颈:

内存不足

缺乏缓存

CPU压力

处理请求线程问题

接下来会介绍如 何采用系统的性能诊断工具来辨明:到底是哪种性能瓶颈导致了服务端解析页面过慢。在用性能诊断工具找出了问题之后,然后针对问题再次做详细的分析,同时收 集数据,根据这些数据来采用对应的措施,对症下药。至于每一种性能问题如何采取何种措施解决,我们后面的文章会一章章的详细详述,请大家稍安勿躁,在此我 们先学会发现问题。发现站点的可能出现了性能问题之后,首先不要立刻的修改站点或者服务器,而是要先诊断出瓶颈出现在哪里。J

内存

首先要判断服务器是否内存不足。因为如果内存不足,那么会增加服务器的CPU压力和磁盘的IO读写操作,发过来说,如果解决了内存不存的问题,自然而然的就减少了CPU和磁盘IO读写操作。

为什么内存不存会增加CPU的压力和磁盘的IO读写操作?

当系统的内存不足的时候,系统就会把原来需要放在内存的一些数据转移保存在磁盘上面,保存为pagefile.sys。当这些数据被需要的时候,那么系统就会去读写磁盘。读写磁盘的操作会消耗CPU资源,同时增加了磁盘的IO操作。

下面我们就来看看,如何识别内存不足性能瓶颈。

我们主要讲述如何在Window服务器系统中诊断这个问题。

Window Server 2003

在系统的命令行中输入perfom。就会弹出如下的窗口。然后点击工具栏上面的”+”按钮,在Performance object下拉框中选择Memory,然后再选择Pages/sec计数器。如果这个值很大,就说明CPU在内存和磁盘之间不断的交换数据。

Windows Vista, Server 2008, Window 7

Windows VistaWindows Server 2008Window 7中不仅可以运行”perfmon”,打开性能监视窗口。而且可以运行resmon来开启资源监视窗口,从这个窗口看,可以更加直观。在资源监视窗口中看到硬错误/”(Hard Faults/sec).然后检查每个进程的这个值,如果进程的硬错误/数值很高,那么就说明服务器已经是内存不足了。(我们将会在后续的文章讲述如何解决这个问题,此处我们先讲述如何找出这个问题)

缓存

大家都知道,在适当的实用缓存策略可以极大的提高服务端的性能。我们一般把数据缓存在内存中,例如浏览器的内存,代理服务器的内存等。而且可以把一些常用的对象,部分的页面,甚至整个页面缓存起来。

缓存的好处有很多,如下:

缩短服务端的响应时间

减少CPU的使用压力

避免频繁的读取数据库

如果把数据缓存在浏览器或者代理服务器,还可以减少不必要的回传。

一般来说,我们把一些使用很频繁的数据或者每次生成都要花费大量资源的数据缓存起来。

但是如何才算得上是使用很频繁

没有一定的标准了,还是那句话:看情况!例如,如果一个页面在1秒钟之内被请求了10次,可能相比较其他的页面而言,这个页面的请求不算””频繁(其他的页面在1秒之内请求100),但是如果把这个页面缓存1秒,也是对性能的极大提升,因为可以一秒之内,有90%的请求都是由缓存响应的。大家可以去参看一下缓存的5分钟法则。至于如何进行缓存,在后面的文章讲解。

CPU

还是和之前内存诊断一样,我们可以运行perfmon命令,然后在Processor分类下面选%Processor Time计数器。如下:

同时,我们还可运行resmon来打开“资源监视窗口”来看:

大家可以看到第一个标红色框的CPU列,其实这个就是反应了 %Processor Time计数器监控的结果。一般来说,如果某个进程的这个值高于了80%,那么就说明这个进程对CPU资源有很大的消耗。如果是w3wp.exe这个进程消耗了80%,就说你的站点消耗了大量的CPU。我们会在后续的文章讲述:如果减小CPU的压力。

处理请求线程

我们知道:发送到服务器的每一个请求,都是有应用程序池中的一个线程来处理的。而且用来处理请求的线程的数量是有IIS来控制的,如果应用程序池中没有空闲的线程来处理新的请求,那么这个请求就被放在请求队列中进行等待。如果在服务端的请求队列太长了,服务器忙不过来,那么新来的请求很有可能被服务器拒绝。

一般来说,一个应用程序池中的可用的线程数量由服务端安装的.NET Framework的版本和IIS的一些设置来决定的。

.NET Framework Version 默认的可用线程数
1.1 20*CPU的数量-8
2.0 12* CPU的数量
3.5, 4.0 IIS 7经典模式:12* CPU的数量
IIS 7 集成模式: 100* CPU的数量

如果在服务端没有足够的线程来处理请求,这种情况就是所谓的线程饥饿。我们可以通过系统的性能计数器来检查站点的服务端是否发生了这种情况:

1. 在命令窗口运行perfmon”.如下:

2. 在打开的性能监视窗口中,选择性能监视器,如下:

3. 点击“+”按钮,然后展开ASP.NET分类:

4. 添加如下计数器:

Request Execution Time 处理一个请求花费的时间(单位是:毫秒)
Request Current 现在ASP.NET运行时要处理的请求数量,包括正在处理的请求和等待队列中的请求。

5. 然后展开ASP.NET Applications”分类,添加如下计数器:

Request Executing 现在正在被处理的请求数

如果”Request Current”的数量大于了Request Executing的数量,那么就说明有请求在等待被处理。后面的文章会详细讲述如何处理这种情况。

OK,今天就暂时发上这些,贵在理解和操作。下一篇接着讲述。

[转载]安装Android开发环境

mikel阅读(1408)

[转载]安装Android开发环境 – 徐文兵的IT博客 – 博客园.

注:在安装之前,确保你的登陆系统账号非中文账号。

中文账号 Eclipse 不能识别中文账号对于的文件夹

Step One 安装Java 并配置系统变量
直接进入:http://java.com/zh_CN/download/installed.jsp
验证当前系统的java版本(注当前好多操作系统默认带Java),更新java

配置系统变量(设置默认java安装位置为C:\Program Files\Java\jre6)
CLASSPATH  : .;C:\Program Files\Java\jre6;
JAVA_HOME  : C:\Program Files\Java\jre6
Path       : C:\Program Files\Java\jre6\bin;C:\Program Files\Android-sdk-windows\tools

Step Two 安装 JDK(Java Development Kit ),an
1) 进入 http://www.oracle.com/网站–> Java–>Java SE–> Downloads
当前的window 下载路径为:https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter
2)下载 jdk 并安装。

Step Three 安装Android SDk

SDk下载路径: http://androidappdocs.appspot.com/sdk/index.htmlhttp://developer.Android.com/sdk/ Ip被封了

下载并安装

Step four 下载Eclipse
1)进入Eclipse官方网站:http://www.eclipse.org/downloads/  选择Eclipse IDE for Java EE Developers
并下载。

2)下载完成后,选择目录进行解压(绿色软件无需安装)

Step five 在Eclipse中安装 Android插件
1)打开Eclipse 软件 ,选择菜单项Help–>install new software
Work with 输入:https://dl-ssl.google.com/android/eclipse/

2) 选择菜单项Window –>Preference窗体 ,选择Android SDK Location:

输入: C:\Program Files\Android\android-sdk-windows

[转载]Android应用程序中资源访问知识小结

mikel阅读(950)

[转载]Android应用程序中资源访问知识小结 – 宁 静 致 远 – 博客园.

Android作为新兴移动操作系统,有众多的优点供我们仔细学习和体会,这里主要总结 一下Android应用程序开发过程中对各种资源的管理和访问,也可以从IOC的角度来理解,即在开发过程中,让对象、组件以及服务之间的依赖关系分离的 原则,这里也就是将应用程序所涉及代码和非代码两部分分离,其好处多多,也不一一列举,经过一番总结,特列下表中:

Android的资源访问 (2)

若从Eclipse开发环境中的目录结构看,如下图所示:

Android资源文件

以上是我对Android应用开发中对资源文件的管理相关知识的小结,如对大家起到一点点的提示作用,也就心满意足了,如有错误,敬请指点赐教,谢谢,

[转载]Android 中文API合集(4)(102篇)(chm格式)

mikel阅读(914)

[转载]Android 中文API合集(4)(102篇)(chm格式) – 农民伯伯 – 博客园.

前言

Android中文翻译组 , Android 中文chm , Android 中文pdf , android 中文 api

Android中文翻译组第四个chm格式合集,收集整理102篇译文制作成合集,参与章节翻译名单:AtomicAmanAndroid Club SYSUcnmahjcoficeHalZhanghenly.zhangjiahuibinKunloveshirui madgoatpengyouhongTinawallace20100_1凌云健笔逝憶流緣天涯明月刀Haiya 胡蝶、桂仁、唐明、颖哥儿、思考的狼德罗德、首当其冲、CN七号、麦子獨鍆躌踄我是谁、一昕、六必治农民伯伯

声明

欢迎转载,但请保留文章原始出处:)

博客园:http://www.cnblogs.com/

Android中文翻译组:http://goo.gl/6vJQl

正文

一、截图

二、章节

三、下载

CHM格式:

Android 中文API合集(4)(102篇)(chm格式)

注意:

如果您是windows2003或windows2008操作系统,请在chm文件上点击右键,选择属性,在弹出的对话框中,点击“解除锁定”,就可以了。 XP chm文件打不开的原因

PDF格式:

Android 中文API合集(4)(102篇)(pdf格式)

四、公告

由于春节耽误审稿及合集推迟发布,第5个合集将累积到4月份发布,敬请谅解!

结束

感谢大家的关注和支持,欢迎加入我们!

[转载]ubuntu 10.10下搭建android开发环境

mikel阅读(959)

[转载]ubuntu 10.10下搭建android开发环境 安装必要工作用软件 – Android火鸟 – 博客园.

进了新公司之后,工作环境有了很大的变化,以前都是在windows环境下进行程序开发,没怎么接触linux系统,新项目组中有6个同事,一水的ubuntu,木有办法,我也换成ubuntu吧。

曾经在学linux下c语言编程的时候,学过一个月的linux,熟悉了一些命令,稍微能在linux系统下完成一些日常的需求了,也搭建过 Android的开发环境,呵呵,时间长了,以前的东西又都忘了,由于那个时候也没把搭建环境的步骤进行记录,现在又抓瞎了,废了很大的劲,终于搭建完 了,记录一下,为以后做好准备。

公欲善其事,必先利其器。在ubuntu下进行开发,就必须要熟悉ubuntu下常用的,能提高效率的工作软件,例如星际译王,gvim等等,目前我只知道这几个软件不错。

搭建Android的开发环境

1. 安装jdk,配置jdk的环境变量

首先,从http://java.sun.com中下载jdk,我的版本是jdk1.6.0_12,我下载的是bin文件,我将下载的 jdk1.6.0_12.bin文件置于/usr/lib/jvm/java(目录任意)中。如果bin文件存在于例如“下载”等类似的目录中时,要将 bin文件拷贝到/usr目录中,需要先修改bin文件的权限,在shell中执行:
sudo chmod u+x /usr/lib/jvm/java/jdk1.6.0_12.bin 修改bin文件权限,使其可执行然后,执行
sudo /usr/lib/jvm/java/jdk1.6.0_12.bin (安装jdk)
将会出现字幕,持续按回车键,直至屏幕显示要求输入 yes/no,此时输入y回车,将会把jdk解压到文件夹,得到jdk1.6.0_12目录。
此时,jdk已安装完毕。jdk将会安装在源文件所在的目录中。下面进行配置jdk的环境变量了。
执行:
sudo vi /etc/environment
在environment中修改,出现如下部分
引用:
PATH=”……:/usr /lib/jvm/java/jdk1.6.0_12/bin”(这个地方有引号,下面的classpath和java_home都没有引号)
CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_12/lib
JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_12

执行:
sudo source /home/用户名/.bashrc(这行代码不执行也不一定错误)
此时,环境变量设置成功(设置环境变量的方法很多,不一一列举)
由于ubuntu10.10 中自带有默认的jdk–openjdk,所以,为了使默认使用的是我们安装的jdk,还要进行如下工作。
执行:
update-alternatives –install /usr/bin/java java /usr/lib/jvm/java/jdk1.6.0_12/bin/java 300
格式:update-alternatives –install /usr/bin/java java 用户的jdk的bin目录/java 300

update-alternatives –install /usr/bin/javac javac /usr/lib/jvm/java/jdk1.6.0_12/bin/javac 300
格式同上
通过这一步将我们安装的jdk加入java选单。
然后执行:
update-alternatives –config java
通过这一步选择系统默认的jdk
这样,再在shell中输入:
java -version时,就会显示系统使用的java是sun的java,至此,jdk安装成功,环境变量设置成功。

2. 安装 ADT

如何安装见开发文档

3. 安装android sdk

3.1 可以采取自己下载sdk或者拷贝别人sdk的方法,那种方法都可以,这个不重要,关键是配置sdk的环境变量

3.2 配置sdk的环境变量

从android 2.3开始,sdk的目录结构发生了变化,多了一个plthforms-tools文件夹,adb文件有tools文件夹移动到了这个目录,因为不能只配 置tools文件夹的环境变量,还需配置platforms-         tools文件夹的环境变量,配置方式和配置java的环境变量一样,秩序在Path后依次添加两个文件夹的路径即可。

至此,android在ubuntu下的开发环境已经搭建成功。

4. 安装eclipse插件

插件:findbugs,subclipse

关于subclipse的使用教程,现在还不会用,等用上一段时间后,会进行总结。

在安装subclipse的时候,可能会报找不到JAVAHL库

解决办法:

执行sudo  apt-get –fix-missing  install libsvn-java命令安装库, 然后在eclipse.ini下面添加  -Djava.library.path=/usr/lib/jni 即可。

安装ubuntu软件

1. 星际译王,gvim,直接在软件中心进行安装即可。

2. 安装rar解压软件

sudo apt-get install unrar

3. 安装虚拟机

sudo add-apt-repository “deb http://download.virtualbox.org/virtualbox/debian maverick non-free”

wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add –

sudo apt-get update

sudo apt-get install virtualbox-ose

4. 文件对比软件 meld

sudo apt-get install meld

目前急需的一些软件

类似于windows下的onenote的日常文档管理软件

类似于outlook的邮件管理软件

类似欲live writer的写博客的软件

这些软件的替代品暂时还没找到,刚入手ubuntu,还有写无从下手的感觉。

[转载]ASP.NET MVC中的扩展点(十)辅助方法

mikel阅读(1161)

[转载]MVC中的扩展点(十)辅助方法 – xfrog – 博客园.

MVC中的辅助方法与ASP.NET中的服务器控件类似,都是用于生成特定的HTML代码。MVC提供了三个辅助类,它们分别是:用于生成HTML元素的 HtmlHelper,用于Ajax处理的AjaxHelper,以及用于生成Url的UrlHelper。这三个辅助类通过ViewPage的 Ajax、Html、Url属性向外提供。由于视图都是是从ViewPage继承的,所以,我们在视图模板中可以直接通过这三个属性来调用辅助方法。

AjaxHelper、HtmlHelper、UrlHelper位于System.Web.Mvc命名空间中,如以下类图所示,这三个辅助类本身仅包含 了一些基本的方法和属性,而具体辅助方法的实现,MVC是采用了扩展方法的技术。如:AjaxHelper通过System.Web.Mvc.Ajax命 名空间中的AjaxExtensions静态类来实现,HtmlHelper通过System.Web.Mvc.Html命名空间中的一系列静态扩展类来 实现。

Helper

这种将具体辅助方法分离到单独命名空间的做法,有利于我们对辅助方法的扩展及替代:

1、要添加新的辅助方法,我们只 需建立自己的静态扩展类,然后在web.config配置文件中添加对扩展类所在命名空间的引 用:<pages><namespaces><add namespace=”静态扩展类所在命名空间”/></namespace></pages>

2、要替换所有默认的辅助方法,我们只需将web.config配置文件中的特定命名空间,如System.Web.Mvc.Html替换为自己的命名空间即可。

模板系统

由DisplayExtensions静态扩展类提供的Html.Display、Html.DisplayFor、 Html.DisplayForModel辅助方法用于根据模型类型自动产生显式Html代码,由EditorExtensions静态扩展类提供的 Html.Editor、Html.EditorFor、Html.EditorForModel辅助方法用于根据模型类型自动产生用于编辑的Html代 码。它们都是建立在模板基础上的:根据模型属性类型,从默认的模板集合中取出相应的模板,然后根据模板内容生产相应的Html元素。

如以下类图所示,通过一些列的特性,可控制模板系统的行为:

TemplateHelper

Html.DisplayForModel和Html.EditorForModel在产生模型的显示/编辑界面时,直接跟具模型每个属性的类型及特性定义来产生每一个属性的Html元素。我们可以通过子视图来定义特定模型的呈现方式,其具体步骤如下:

1、在工程 Views\Shared目录下创建两个新的文件夹:DisplayTemplates和EditorTemplates,其中 DisplayTemplates文件夹用于保存模型显式界面的模板(由Html.DisplayForModel辅助方法使 用),EditorTemplates文件夹用于保存模型编辑界面的模板(由Html.EditorForModel辅助方法使用)。

2、在相应文件夹下添加新的视图文件,名称必须和模型类名完全一致,勾选“创建子视图选项”。

3、与视图模板一致,可在子视图中访问ViewData及Model

当我们定义完子视图后,模板系统首先根据模型类型名在相应文件夹中查找是否有自定义的模板,如果有则使用自定义模板,没有则使用默认模板。

Mvc通过一些列特性来控制模板系统的行为,但是在有些情况下,模型源代码我们是不能修改的,比如由Linq to SQL或.NET实体框架产生的模型类,这些类由工具自动产生,我们无法直接修改源代码。幸运的是,这些自动产生的类都是定义为partial的,这样我 们可以使用System.ComponentModel.DataAnnotations命名空间下的MetadataTypeAttribute特性来 定义一个与模型相关的元数据类型,例如,Product模型类型定义如下:

namespace CnBlogs.TestModel
{
    public partial class Product
    {
        public string Name { get; set; }
        public string Description { get; set; }
    }
}

.codearea { color: black; background-color: white; line-height: 18px; border: 1px solid rgb(79, 129, 189); margin: 0pt; width: auto ! important; overflow: auto; text-align: left; font-size: 12px; font-family: “Courier New”,”Consolas”,”Fixedsys”,”BitStream Vera Sans Mono”,courier,monospace,serif; }.codearea pre { color: black; line-height: 18px; padding: 0pt 0pt 0pt 12px ! important; margin: 0em; background-color: rgb(255, 255, 255) ! important; }.linewrap pre { white-space: pre-wrap; word-wrap: break-word; }.codearea pre.alt { background-color: rgb(247, 247, 255) ! important; }.codearea .lnum { color: rgb(79, 129, 189); line-height: 18px; }我们可以定义与之相关的元数据类:

namespace CnBlogs.TestModel
{
    [MetadataType(typeof(ProductMetadata))]
    public partial class Product
    {
        private class ProductMetadata
        {
            [DisplayName("产品名称")]
            public string Name { get; set; }
            [DisplayName("备注")]
            public string Description { get; set; }
        }
    }
}

.codearea { color: black; background-color: white; line-height: 18px; border: 1px solid rgb(79, 129, 189); margin: 0pt; width: auto ! important; overflow: auto; text-align: left; font-size: 12px; font-family: “Courier New”,”Consolas”,”Fixedsys”,”BitStream Vera Sans Mono”,courier,monospace,serif; }.codearea pre { color: black; line-height: 18px; padding: 0pt 0pt 0pt 12px ! important; margin: 0em; background-color: rgb(255, 255, 255) ! important; }.linewrap pre { white-space: pre-wrap; word-wrap: break-word; }.codearea pre.alt { background-color: rgb(247, 247, 255) ! important; }.codearea .lnum { color: rgb(79, 129, 189); line-height: 18px; }只需注意:模型类型必须定义为partial,与模型关联的元数据定义包含到分离的模型类中,是模型类的一个内嵌类。最后通过MetadataType特性来指定元数据类型。

源代码下载

[转载]Android应用程序主要组件知识小结

mikel阅读(1406)

[转载]Android应用程序主要组件知识小结 – 宁 静 致 远 – 博客园.

Android系统中通过几个主要的组件以其灵活的组织方式在方便了开发者的同时,也不失其炫丽的效果,实在是值得我不断深入了解和学习,下面的图作为近一段时间对Android组件知识的一个小结,难免有遗漏或错误之处,敬请各位不吝赐教。

Android应用程序组件

我觉得深刻理解和掌握这几个组件的使用方法以及相互关系,就相当于把握了Android应用程序的主要经络,更能理清我们的思路,上面图中所示,乃是我占用了几个钟头的休息时间,整理出来 的,难免有遗漏和错误之处,拿出来共享一下,也当作是抛砖引玉了,