今天被这么一个问题困扰:当我通过本机ping另一台在同一局域网内(即在同一网段)的计算机时,发现,如果防火墙开启的话,无论如何也ping不通。一旦关闭防火墙就可以ping通了。这是为什么呢?究竟该怎么设置呢? 原因是这样的,现在的计算机系统,出于安全考虑,在默认情况下是不允许外部主机对其进行ping测试的。但在一个安全的局域网环境中,Ping测试又是管理员进行网络测试所必须的。如何更改设置呢?XP系统和WIN7系统有所不同: Windows XP: Windows防火墙 --> 高级 --> ICMP --> 设置 --> 把“允许传入回显请求”前打上勾 --> 确定 --> 大功告成。 Windows 7: Windows防火墙 --> 高级设置 --> 入站规则 --> 在列表里找到“文件和打印机共享(回显请求 – ICMPv4-In)” --> 右击选择启用规则,并在其属性里设置为‘允许连接’--> 确定 --> 大功告成。 from:http://blog.csdn.net/zltianhen/article/details/7802191
View Details最近家里和办公室新装 Windows Server 2012 R2 数据中心版操作系统,仍然非常脑残的两个设计:脑残的开始菜单、脑残的Win+Space切换输入法。除此之外还可以接受,当然我已将脑残的开始通过Start8解决掉了,另外说个关于Win2012R2网速痛苦的经历。 最近发现不管是家里还是办公室,打开有些网站都非常的慢,准确说是响应非常的慢,输入网址驾车后要等甚至8秒才得到响应打开网页,并且还不是所有网 站都这样,部分(包括手里维护的几个网站),以为是服务器问题于是将网站服务器重装了系统,最后发现我真二,没解决问题后才发现是我电脑的问题,远程了其 它两台不是2012的系统打开流畅的很,百度一下才发现问题出在Windows上。我不是这方面的专家只好转原文如下,灰常感谢网友的文章。 Windows Server 2012/2012 R2 上网非常慢的解决办法(转载): 装了个windows server 2012玩玩,发现效果真心不错,尤其是对负载的处理上,很少听到风扇的呼呼声了。但发现一个问题,在办公室上网,打开网页,总是要等2-3秒才显示出页 面内容,但回家后就没有这种问题了。折腾一整天,各种修复,各种改,防火墙、驱动、组策略、MTU、TTL,各种不好使。 本想装一个Wireshark抓下包分析一下,但发现winpcap装不上,坑爹。我就在想,难道服务器系统就这原因?网上没找到任何解决办法,连提出这个问题的人都没看到。 还是得抓包分析,安装了个Microsoft Network Manager,微软自家的抓包工具,终于好使了。分析TCP数据包,发现在单位,每打开一个网页,都会先向目标发送好几个TCP ECN(显式拥塞通知)数据包,然后等到2-3秒后,再与目标3次握手建立TCP连接;但是在家却没有发送TCP ECN数据包。 原来Windows server 2012默认打开了ECN功能(貌似从Windows server 2008之后都默认打开),个人操作系统却没有打开,而办公室网络的确拥塞不小,造成了这种效果。好了,执行“netsh int tcp set global ecn=disable”命令后,果断OK了。 很明确了,只需要CMD执行以下命令,网速马上恢复,我和小伙伴们都惊呆了: netsh int tcp set global ecn=disable 果然奏效,开心…灰常感谢:(http://blog.sina.com.cn/s/blog_475d6daf0101bxtn.html)http://blog.sina.com.cn/s/blog_475d6daf0101bxtn.html 关于这类命令及原理我也不是很清楚也不去深究了,以下还有类似网络流行的提高网速方法: 接收方缩放状态 : enabled 烟囱卸载状态 : automatic NetDMA 状态 : enabled 直接缓存访问(DCA) : enabled 接收窗口自动调谐级别 : normal 附加拥塞控制提供程序 : none ECN 功能 : disabled RFC 1323 时间戳 : enable 逐项输入命令: 接收方缩放状态:netsh int tcp set global rss=enabled 烟囱卸载状态 :netsh int tcp set global chimney=automatic NetDMA 状态:netsh int […]
View Details当我跟人说我是一个Web程序员,他们会认为我是个天才。当我告诉他们我工作的公司是编写火狐浏览器的,他们认为我跟上帝一样伟大。我可以想象,其 他的程序员也会跟我一样受到这样的待遇。这些话我并不是要跟自己说,或说给我们圈内人听,我说这些是因为很多圈外人对我们的编程没有任何概念。 甚至在业内,一些程序员对另外一些程序员也是高山仰止。在我的眼中,Mozilla公司里很多其他程序员简直就是传奇,而事实上,很多时候,他们真是。就是这个原因,我们程序员中很多人只才会患上骗子综合征,就是这个原因,我们才害怕加入OSS项目,害怕在开发大会上和明星程序员们站在一起。 下面这个漫画展示了人们眼中的编程生活和实际编程生活的区别: 我们经常会在编程时犯愚蠢的错误。我们整天盯着屏幕看,寻找一行让我们的应用无法启动的代码。我们诅咒浏览器为什么不能正常显示页面,却发现是一行明显的错误造成的。每个程序员都有这种时刻,冥思苦索是每天的例行活动。 这是程序员的真实生活。 英文原文标题是:The Truth About Programming Perception。 稿源:程序师网 FROM:http://www.oschina.net/news/54978/truth-programming-perception
View Details一.数值数据类型 数字或数值数据在PHP中一般就两种double和int。 PHP是一种松散类型的脚本语言,要注意类型转换的方式。 .代码如下: <?php $a = '5'; //数字的字符串也是数字,参与数学运算当数字处理 echo is_numeric ( $a ); //1 echo '<br/>'; echo 7 + $a; //12 echo '<br/>'; echo '7' + $a; //12 echo '<br/>'; //用.连接后就按字符串处理 echo '7' . $a; //75 ?> 二.随机数 Rand()函数是libc中定义的一个随机函数的简单包装器。 Mt_rand()函数是一个很好的代替实现。 .代码如下: <?php $a = rand(0,10); echo $a; echo '<br/>'; echo getrandmax(); echo '<br/>'; $b = mt_rand(0,10); echo $b; echo '<br/>'; echo mt_getrandmax(); echo '<br/>'; ?> output 1 32767 6 2147483647 三.格式化数据 .代码如下: <?php $a = 12345.6789; //用于设置保留多少位小数点 echo number_format($a,2); echo '<br/>'; //也可以改变默认小数点的符号表示和千分位的表示符号 echo number_format($a,2,’#',’*') ?> Output 12,345.68 12*345#68 四.数学函数 函数 功能 Abs() 取绝对值 Floor() 舍去法取整 Ceil() 进一法取整 Round() 四舍五入 […]
View DetailsEclipse中全局搜索和更替 Eclipse全局搜索步骤 使用快捷键“ctrl+H”打开文件搜索对话框,选择“File Search”标签,在Containing text中输入你需要搜索的字符串,在Scope中,选择你要搜索的范围,点击Search。 在Search视图中,会列出搜索得到的结果,点击打开属性结构。双击搜索结构,就会显示源代码中的搜索结果。 Eclipse全局替换步骤 在全局搜索到目标字符串后,在Search视图中,选择搜索到目标字符串,右键->Replace All,弹出对话框。在With:当中,填写需要更改的字符串。点击Replace按钮。 from:http://blog.csdn.net/p106786860/article/details/9162537
View Details#测试网址: http://localhost/blog/testurl.php?id=5 //获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br>"; #localhost //获取网页地址 echo $_SERVER['PHP_SELF']."<br>"; #/blog/testurl.php //获取网址参数 echo $_SERVER["QUERY_STRING"]."<br>"; #id=5 //获取用户代理 echo $_SERVER['HTTP_REFERER']."<br>"; //获取完整的url echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']; #http://localhost/blog/testurl.php?id=5 //包含端口号的完整url echo 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; #http://localhost:80/blog/testurl.php?id=5 //只取路径 $url=’http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"]; echo dirname($url); #http://localhost/blog FROM:http://www.cnblogs.com/A-Song/archive/2011/12/14/2288215.html
View Details首先说说为什么要进行日志记录。在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分。它可以记录下系统所产生的所有行为,并按照某种规范表达出来。我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。 Log4net是一个很著名的开源的日志记录组件。官方网址为:http://logging.apache.org/log4net/ ,使用Log4net能够很简单的为我们的程序添加日志记录功能。下面我们先通过一个网站例子来说明如何在.net中使用log4net。 创建日志记录步骤 第一步, 当然是添加log4net.dll的引用啦,我这里提供一个log4net的dll文件,懒得去官网下的可以到这里下http://www.vdisk.cn/down/index/7509396A7366 第二步, 在AssemblyInfo.cs文件中添加下面一句话: 1 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Web.config", Watch = true)] 这句话的意思是log4net会自动寻找配置文件App.config或Web.config从而获得并加载其中的配置信息。如果想log4net随时监视配置文件以便重新加载的话就要这样写按照上面一样写(winform程序ConfigFile为App.config)。 第三步, 配置Web.config。
|
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 |
<configuration> <configSections> <!--注意:这里需要添加--> <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/> </configSections> <connectionStrings> <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" /> </connectionStrings> <!--注意:这里需要添加--> <log4net> <!--定义输出到文件中--> <appender name="LogFileAppender" type="log4net.Appender.FileAppender"> <!--定义文件存放位置--> <file value="C:\log.txt" /> <appendToFile value="true" /> <rollingStyle value="Date" /> <datePattern value="yyyyMMdd-HH:mm:ss" /> <layout type="log4net.Layout.PatternLayout"> <!--输出格式--> <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" /> </layout> </appender> <!--定义输出到控制台命令行中--> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!--定义输出到windows事件中--> <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb--> <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" /> <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> <!--定义各个参数--> <parameter> <parameterName value="@logDate" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date" /> </layout> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@logLevel" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender> <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。--> <root> <!--文件形式记录日志--> <appender-ref ref="LogFileAppender" /> <!--控制台控制显示日志--> <appender-ref ref="ConsoleAppender" /> <!--Windows事件日志--> <!--<appender-ref ref="EventLogAppender" />--> <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉 <appender-ref ref="AdoNetAppender_Access" /> --> </root> </log4net> <system.web> <compilation debug="true" targetFramework="4.0" /> <httpModules> <add name="fileUpload" type="WebApplication3.ProcessFileModule"/> </httpModules> <authentication mode="Forms"> <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> </authentication> <membership> <providers> <clear/> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <profile> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> </profile> <roleManager enabled="false"> <providers> <clear/> <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> </providers> </roleManager> <httpRuntime maxRequestLength="10240000"/> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration> |
上面这段配置取自周公,配置的说明上面已经注释的比较详细了。 第四步, 在程序中记录信息。我们在项目下Default.aspx的Page_Load方法加入如下代码:
|
1 2 3 |
//获得log4net实例 ILog log = log4net.LogManager.GetLogger("LogFileAppender"); log.Info("Default.aspx下面的PageLoad方法被执行"); |
然后运行项目,可以发现在c:\log4netfile.txt中已经记录了一条日志信息:
|
1 |
记录时间:2011-04-21 21:26:17,729 线程ID:[4] 日志级别:INFO 出错类:LogFileAppender property:[(null)] - 错误描述:Default.aspx下面的PageLoad方法被执行 |
通过上面这几步我想您已经能够为程序创建一些简单日志记录功能了。下面我们再来详细说说log4net其他的一些使用方法与特点。 log4net详细说明 这里我通过问答的形式来说明log4net的一些应用。 1.log4net总共有几种记录方式,每种方式该如何配置与使用? Log4net目前支持的输出方式包括:
|
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 |
1 AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式。 2 AnsiColorTerminalAppender 在ANSI 窗口终端写下高亮度的日志事件。 3 AspNetTraceAppender 能用asp.net中Trace的方式查看记录的日志。 4 BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件。 5 ConsoleAppender 将日志输出到控制台。 6 EventLogAppender 将日志写到Windows Event Log. 7 FileAppender 将日志写到文件中。 8 LocalSyslogAppender 将日志写到local syslog service (仅用于UNIX环境下). 9 MemoryAppender 将日志存到内存缓冲区。 10 NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。 11 RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service。 12 RemotingAppender 通过.NET Remoting将日志写到远程接收端。 13 RollingFileAppender 将日志以回滚文件的形式写到文件中。 14 SmtpAppender 将日志写到邮件中。 15 TraceAppender 将日志写到.NET trace 系统。 16 UdpAppender 将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。 |
可以看到目前支持的方式还是很多的,我这里调几个认为常用的做个例子。 1.文件的方式我们上面已经讲过了,这里不再做例子了。 2.数据库方式: 首先,添加数据库记录appender
|
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 |
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender"> <!--数据库连接字符串--> <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" /> <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> <!--定义各个参数--> <parameter> <parameterName value="@logDate" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date" /> </layout> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@logLevel" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender> |
然后建立c:log4net.mdb 数据库,并在代码中启用数据库记录方式:
|
1 2 3 |
//获得log4net实例 ILog log = log4net.LogManager.GetLogger("AdoNetAppender_Access"); log.Debug("Default.aspx下面的PageLoad方法被执行"); |
这样日志就被记录到数据库中了。 2.log4net如何过滤我想要的日志信息,比如一个日志中只记录程序错误日志? 这个需求可以通过配置filter来实现。具体操作如下: 全局方式: 这种方式会将级别应用于所有的日志输入方式。具体操作为在root节点下添加:
|
1 2 3 4 5 |
<!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 --> <!--如果没有定义LEVEL的值,则缺省为DEBUG--> <level value="ERROR" /> |
这样对于所有的日志记录方式,所有地域ERROR级别的都不会被记录了。 单独配置级别方式: 该方式不会影响其他的日志输入方式。方法如下为,在具体的appender下添加filter:
|
1 2 3 4 |
<filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <param name="LevelMax" value="Fatal" /> </filter> |
这种方式可以配置记录级别的方位,如果只需要记录一种,则最大和最小设置一样就行了。 3.你上面的日志输出格式我不喜欢,如何在log4net中配置我想要的日志输出格式? log4net的输入格式定义在每个appender的layout中。具体的有以下内置可选项: %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 %n(new line):换行 %d(datetime):输出当前语句运行的时刻 %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 %t(thread id):当前语句所在的线程ID %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等 %c(class):当前日志对象的名称,例如: %f(file):输出语句所在的文件名。 %l(line):输出语句所在的行号。 %数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。 通过这些东西,你可以任意组合你喜欢的输出格式内容。 4.有没有方式控制程序自动按日期记录日志信息,即每天的日志都在不同的日志文件中? 其实这种方式对应于一种特定的记录方式:RollingFileAppender。这种方式也是基于文件记录的,不过他提供更加灵活的日志记录方式。具体说来他可以按日志文件的大小或者日志记录的时间进行自动变换日志文件。 按每天不同的日期进行记录分类:
|
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 |
<appender name="RollingLogFileAppenderEveryMin" type="log4net.Appender.RollingFileAppender"> <!--日志文件名开头--> <file value="c:\logfile.txt" /> <!--是否追加到文件--> <appendToFile value="true" /> <!--变换的形式为日期--> <rollingStyle value="Date" /> <!--日期的格式,每分钟换一个文件记录--> <datePattern value="yyyyMMdd-HHmm" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> |
按照日志文件的大小进行变换,通过这种方式可以有效降低日志文件体积膨胀的问题:
|
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 |
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <!--日志文件名--> <file value="c:\log.txt"/> <!--是否在文件中追加--> <appendToFile value="true"/> <!--按照文件的大小进行变换日志文件--> <rollingStyle value="Size"/> <!--最大变换数量,如果超过这个数量则从第一个文件开始复写--> <maxSizeRollBackups value="10"/> <!--最大文件大小,支持KB,MB,GB--> <maximumFileSize value="100KB"/> <!--日志文件名是否为静态--> <staticLogFileName value="true"/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/> </layout> </appender> |
最后从网上找了一段写日志的原则,感觉还是很好的: 【写日志的原则】 Ⅰ.在catch后,把异常写入日志. Ⅱ.在调用第三方控件的开始和结束处. Ⅲ.在连接数据库的开始结束处. Ⅳ.除非必要,不要在循环体中加入日志,否则一旦出问题可能导致日志暴增. Ⅴ.在自己认为很重要的逻辑处写入日志. 如果要将log方法写在类库里面,那么可以参考这篇文章http://hi.baidu.com/sjbh/blog/item/10cda8d689fb0c3807088b87.html from:http://www.cnblogs.com/qianlifeng/archive/2011/04/22/2024856.html
View DetailsWindows Service这一块并不复杂,但是注意事项太多了,网上资料也很凌乱,偶尔自己写也会丢三落四的。所以本文也就产生了,本文不会写复杂的东西,完全以基础应用的需求来写,所以不会对Windows Service写很深入。 本文介绍了如何用C#创建、安装、启动、监控、卸载简单的Windows Service 的内容步骤和注意事项。 一、创建一个Windows Service 1)创建Windows Service项目 2)对Service重命名 将Service1重命名为你服务名称,这里我们命名为ServiceTest。 二、创建服务安装程序 1)添加安装程序 之后我们可以看到上图,自动为我们创建了ProjectInstaller.cs以及2个安装的组件。 2)修改安装服务名 右键serviceInsraller1,选择属性,将ServiceName的值改为ServiceTest。 3)修改安装权限 右键serviceProcessInsraller1,选择属性,将Account的值改为LocalSystem。 三、写入服务代码 1)打开ServiceTest代码 右键ServiceTest,选择查看代码。 2)写入Service逻辑 添加如下代码:
|
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 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; namespace WindowsServiceTest { public partial class ServiceTest : ServiceBase { public ServiceTest() { InitializeComponent(); } protected override void OnStart(string[] args) { using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Start."); } } protected override void OnStop() { using (System.IO.StreamWriter sw = new System.IO.StreamWriter("C:\\log.txt", true)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Stop."); } } } } |
这里我们的逻辑很简单,启动服务的时候写个日志,关闭的时候再写个日志。 四、创建安装脚本 在项目中添加2个文件如下(必须是ANSI或者UTF-8无BOM格式): 1)安装脚本Install.bat
|
1 2 3 4 |
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe WindowsServiceTest.exe Net Start ServiceTest sc config ServiceTest start= auto |
2)卸载脚本Uninstall.bat
|
1 |
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WindowsServiceTest.exe |
3)安装脚本说明 第二行为启动服务。 第三行为设置服务为自动运行。 这2行视服务形式自行选择。 4)脚本调试 如果需要查看脚本运行状况,在脚本最后一行加入pause 五、在C#中对服务进行控制 0)配置目录结构 简历一个新WPF项目,叫WindowsServiceTestUI,添加对System.ServiceProcess的引用。 在WindowsServiceTestUI的bin\Debug目录下建立Service目录。 将WindowsServiceTest的生成目录设置为上面创建的Service目录。 生成后目录结构如下图 1)安装 安装时会产生目录问题,所以安装代码如下:
|
1 2 3 4 5 6 7 8 |
string CurrentDirectory = System.Environment.CurrentDirectory; System.Environment.CurrentDirectory = CurrentDirectory + "\\Service"; Process process = new Process(); process.StartInfo.UseShellExecute = false; process.StartInfo.FileName = "Install.bat"; process.StartInfo.CreateNoWindow = true; process.Start(); System.Environment.CurrentDirectory = CurrentDirectory; |
2)卸载 卸载时也会产生目录问题,所以卸载代码如下:
|
1 2 3 4 5 6 7 8 |
string CurrentDirectory = System.Environment.CurrentDirectory; System.Environment.CurrentDirectory = CurrentDirectory + "\\Service"; Process process = new Process(); process.StartInfo.UseShellExecute = false; process.StartInfo.FileName = "Uninstall.bat"; process.StartInfo.CreateNoWindow = true; process.Start(); System.Environment.CurrentDirectory = CurrentDirectory; |
3)启动 代码如下:
|
1 2 3 4 5 |
using System.ServiceProcess; ServiceController serviceController = new ServiceController("ServiceTest"); serviceController.Start(); |
4)停止
|
1 2 3 |
ServiceController serviceController = new ServiceController("ServiceTest"); if (serviceController.CanStop) serviceController.Stop(); |
5)暂停/继续
|
1 2 3 4 5 6 7 8 |
ServiceController serviceController = new ServiceController("ServiceTest"); if (serviceController.CanPauseAndContinue) { if (serviceController.Status == ServiceControllerStatus.Running) serviceController.Pause(); else if (serviceController.Status == ServiceControllerStatus.Paused) serviceController.Continue(); } |
6)检查状态
|
1 2 |
ServiceController serviceController = new ServiceController("ServiceTest"); string Status = serviceController.Status.ToString(); |
六、调试Windows Service 1)安装并运行服务 2)附加进程 3)在代码中加入断点进行调试 七、总结 本文对Windows service的上述配置都未做详细解释,但是按上述步骤就可以制作可运行的Windows Service,从而达到了工作的需求。 FROM:http://www.cr173.com/html/15350_1.html
View Details今天遇到了这样的事情,“页面超过了最大请求长度问题” “/AppShop”应用程序中的服务器错误。 超过了最大请求长度。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Web.HttpException: 超过了最大请求长度。 源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 堆栈跟踪: [HttpException (0x80004005): 超过了最大请求长度。] System.Web.HttpRequest.GetEntireRawContent() +8766626 System.Web.HttpRequest.GetMultipartContent() +62 System.Web.HttpRequest.FillInFormCollection() +168 System.Web.HttpRequest.get_Form() +68 System.Web.HttpRequest.get_HasForm() +8722023 System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull) +97 System.Web.UI.Page.DeterminePostBackMode() +63 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +133 问题:在百万行数据表中真分页查询,页面上有一DropDownList用来选择页码,达到十万个下拉项,viewstate=true。 在页面回传时,产生超过了最大请求长度的 问题 分析:这可能是由于viewstate包含数据量过大,引起回传request包含数据量过大。 解决方案:可以在webconfig文件中修改最大请求长度。 <configuration> <system.web> <httpRuntime maxRequestLength="10000" ……> </system.web> </configuration> 结果:先设为1000,不通过,设为10000后,通过 总结:或进行二级分页可能更好 FORM:http://www.cnblogs.com/wenanry/archive/2009/04/16/1437094.html
View Details