为 Web 设计师准备的 32 个有用的 CSS3 教程
很有用的 CSS3 教程来提升你的 Web 设计技能。 1. Circle Navigation Effect With CSS3to Build An Awesome 2. CSS3 Signup Form 3. Create An Animated 3d Bar Chart Using CSS3 4. Beautiful Photo Stack Gallery With JQuery and CSS3 5. Thumbnail Proximity Effect With JQuery and CSS3 6. How To Make An Awesome Cufonized Fly-Out Menu With JQuery and CSS3 7. Stylish CSS3 Progress Bars 8. Create a Unique Contact Form With CSS3 Transitions 9. Direction-Aware Hover Effect With CSS3 and JQuery 10. Create An Audio Player in HTML5 &Amp; […]
View DetailsAsp.net Web Applicatoin实现自定义HttpModule拦截异常处理
Asp.net的NamePipe机制给我们提供了很多扩展性. 使用HttpModule我们可能实现的有: 强制站点范围的Cookie策略 集中化监控与日志 编写设置与删除HTTP头 控制response输出,如删除多余空白字符 Session管理 认证与受权 下面我们来看如何实现自定义异常处理:
1 |
<span class="lnum"> 1: </span> <span class="kwrd">public</span> <span class="kwrd">class</span> ErrorModule:IHttpModule |
1 |
<span class="lnum"> 2: </span> { |
1 |
<span class="lnum"> 3: </span> <span class="preproc">#region</span> IHttpModule Members |
1 |
<span class="lnum"> 4: </span> |
1 |
<span class="lnum"> 5: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 6: </span> <span class="rem">/// Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>.</span> |
1 |
<span class="lnum"> 7: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 8: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> Dispose() |
1 |
<span class="lnum"> 9: </span> { |
1 |
<span class="lnum"> 10: </span> <span class="rem">//do nothing </span> |
1 |
<span class="lnum"> 11: </span> } |
1 |
<span class="lnum"> 12: </span> |
1 |
<span class="lnum"> 13: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 14: </span> <span class="rem">/// Initializes a module and prepares it to handle requests.</span> |
1 |
<span class="lnum"> 15: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 16: </span> <span class="rem">/// <param name="context">An <see cref="T:System.Web.HttpApplication"/> that provides access to the methods, properties, and events common to all application objects within an ASP.NET application</param></span> |
1 |
<span class="lnum"> 17: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> Init(HttpApplication context) |
1 |
<span class="lnum"> 18: </span> { |
1 |
<span class="lnum"> 19: </span> context.Error += <span class="kwrd">new</span> EventHandler(customcontext_Error); |
1 |
<span class="lnum"> 20: </span> } |
1 |
<span class="lnum"> 21: </span> |
1 |
<span class="lnum"> 22: </span> <span class="kwrd">private</span> <span class="kwrd">void</span> customcontext_Error(<span class="kwrd">object</span> sender, EventArgs e) |
1 |
<span class="lnum"> 23: </span> { |
1 |
<span class="lnum"> 24: </span> HttpContext ctx = HttpContext.Current; |
1 |
<span class="lnum"> 25: </span> HttpResponse response = ctx.Response; |
1 |
<span class="lnum"> 26: </span> HttpRequest request = ctx.Request; |
1 |
<span class="lnum"> 27: </span> |
1 |
<span class="lnum"> 28: </span> Exception exception = ctx.Server.GetLastError(); |
1 |
<span class="lnum"> 29: </span> |
1 |
<span class="lnum"> 30: </span> var sboutput = <span class="kwrd">new</span> StringBuilder(); |
1 |
<span class="lnum"> 31: </span> sboutput.Append(<span class="str">"Querystring:<p/>"</span>); |
1 |
<span class="lnum"> 32: </span> <span class="rem">//Get out the query string </span> |
1 |
<span class="lnum"> 33: </span> <span class="kwrd">int</span> count = request.QueryString.Count; |
1 |
<span class="lnum"> 34: </span> <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i < count; i++) |
1 |
<span class="lnum"> 35: </span> { |
1 |
<span class="lnum"> 36: </span> sboutput.AppendFormat(<span class="str">"<br/> {0}:-- {1} "</span>, request.QueryString.Keys[i], request.QueryString[i]); |
1 |
<span class="lnum"> 37: </span> } |
1 |
<span class="lnum"> 38: </span> <span class="rem">//Get out the form collection info</span> |
1 |
<span class="lnum"> 39: </span> sboutput.Append(<span class="str">"<p>-------------------------<p/>Form:<p/>"</span>); |
1 |
<span class="lnum"> 40: </span> count = request.Form.Count; |
1 |
<span class="lnum"> 41: </span> <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i < count; i++) |
1 |
<span class="lnum"> 42: </span> { |
1 |
<span class="lnum"> 43: </span> sboutput.AppendFormat(<span class="str">"<br/> {0}:-- {1} -- <br/>"</span>, request.Form.Keys[i], request.Form[i]); |
1 |
<span class="lnum"> 44: </span> } |
1 |
<span class="lnum"> 45: </span> sboutput.Append(<span class="str">"<p>-------------------------<p/>ErrorInfo:<p/>"</span>); |
1 |
<span class="lnum"> 46: </span> sboutput.AppendFormat(<span class="str">@"Your request could not processed. Please press the back button on your browser and try again.<br/></span> |
1 |
<span class="lnum"> 47: </span> If the problem persists, please contact technical support<p/> |
1 |
<span class="lnum"> 48: </span> Information below is for technical support:<p/> |
1 |
<span class="lnum"> 49: </span> <p/>URL:{0}<p/>Stacktrace:---<br/>{1}<p/>InnerException:<br/>{2}" |
1 |
<span class="lnum"> 50: </span> , ctx.Request.Url, exception.InnerException.StackTrace, exception.InnerException); |
1 |
<span class="lnum"> 51: </span> |
1 |
<span class="lnum"> 52: </span> response.Write(sboutput.ToString()); |
1 |
<span class="lnum"> 53: </span> |
1 |
<span class="lnum"> 54: </span> <span class="rem">// To let the page finish running we clear the error</span> |
1 |
<span class="lnum"> 55: </span> ctx.Server.ClearError(); |
1 |
<span class="lnum"> 56: </span> } |
1 |
<span class="lnum"> 57: </span> |
1 |
<span class="lnum"> 58: </span> <span class="preproc">#endregion</span> |
1 |
<span class="lnum"> 59: </span> |
1 |
<span class="lnum"> 60: </span> } |
上面的代码实现了IHttpModule接口, 实现基于HttpApplication.Error事件, 接着我们自定义输出了一些信息,包括Form,QueryString. 最后把原来的Error信息清除了,这样你看到以前那个黄页了. 这个自定义的Module可以用于调试Web应用程序使用. Web.config中配置:
1 |
<span class="kwrd"><</span><span class="html">httpModules</span><span class="kwrd">></span> |
1 |
<span class="kwrd"><</span><span class="html">add</span> <span class="attr">name</span><span class="kwrd">="ErrorLoggingModule"</span> <span class="attr">type</span><span class="kwrd">="MyWeb.ErrorModule"</span><span class="kwrd">/></span> |
1 |
<span class="kwrd"></</span><span class="html">httpModules</span><span class="kwrd">></span> |
实际开发中,我们可以做的事儿很多,对这些信息记日志,发邮件. 如下, 我们演示使用Enterprise Library 做异常处理并日志记录,部分代码如下:
1 |
<span class="lnum"> 1: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 2: </span> <span class="rem">/// Handles the Error event of the EntLibLogging control.</span> |
1 |
<span class="lnum"> 3: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 4: </span> <span class="rem">/// <param name="sender">The source of the event.</param></span> |
1 |
<span class="lnum"> 5: </span> <span class="rem">/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param></span> |
1 |
<span class="lnum"> 6: </span> <span class="rem">/// <remarks>author Petter Liu http://wintersun.cnblogs.com</remarks></span> |
1 |
<span class="lnum"> 7: </span> <span class="kwrd">private</span> <span class="kwrd">void</span> EntLibLogging_Error(<span class="kwrd">object</span> sender, EventArgs e) |
1 |
<span class="lnum"> 8: </span> { |
1 |
<span class="lnum"> 9: </span> var builder = <span class="kwrd">new</span> ConfigurationSourceBuilder(); |
1 |
<span class="lnum"> 10: </span> |
1 |
<span class="lnum"> 11: </span> builder.ConfigureInstrumentation() |
1 |
<span class="lnum"> 12: </span> .ForApplicationInstance(<span class="str">"MyApp"</span>) |
1 |
<span class="lnum"> 13: </span> .EnableLogging() |
1 |
<span class="lnum"> 14: </span> .EnablePerformanceCounters(); |
1 |
<span class="lnum"> 15: </span> |
1 |
<span class="lnum"> 16: </span> <span class="rem">//a single exception handling policy named MyPolicy for exceptions of type ArgumentNullException. </span> |
1 |
<span class="lnum"> 17: </span> <span class="rem">//The handler for this exception policy will log the exception to the General category (defined in the Logging Application Block configuration) </span> |
1 |
<span class="lnum"> 18: </span> <span class="rem">//as a warning with event ID 9000, wrap the ArgumentNullException with an InvalidOperationException, set the new exception message to MyMessage, and then re-throw the exception.</span> |
1 |
<span class="lnum"> 19: </span> builder.ConfigureExceptionHandling() |
1 |
<span class="lnum"> 20: </span> .GivenPolicyWithName(<span class="str">"MyPolicy"</span>) |
1 |
<span class="lnum"> 21: </span> .ForExceptionType<ArgumentNullException>() |
1 |
<span class="lnum"> 22: </span> .LogToCategory(<span class="str">"Exception"</span>) |
1 |
<span class="lnum"> 23: </span> .WithSeverity(System.Diagnostics.TraceEventType.Warning) |
1 |
<span class="lnum"> 24: </span> .UsingEventId(9000) |
1 |
<span class="lnum"> 25: </span> .WrapWith<InvalidOperationException>() |
1 |
<span class="lnum"> 26: </span> .UsingMessage(<span class="str">"MyMessage"</span>) |
1 |
<span class="lnum"> 27: </span> .ThenNotifyRethrow(); |
1 |
<span class="lnum"> 28: </span> |
1 |
<span class="lnum"> 29: </span> <span class="rem">//logging application </span> |
1 |
<span class="lnum"> 30: </span> builder.ConfigureLogging() |
1 |
<span class="lnum"> 31: </span> .WithOptions |
1 |
<span class="lnum"> 32: </span> .DoNotRevertImpersonation() |
1 |
<span class="lnum"> 33: </span> .LogToCategoryNamed(<span class="str">"Exception"</span>) |
1 |
<span class="lnum"> 34: </span> .SendTo.FlatFile(<span class="str">"Exception Logging File"</span>) |
1 |
<span class="lnum"> 35: </span> .FormatWith(<span class="kwrd">new</span> FormatterBuilder() |
1 |
<span class="lnum"> 36: </span> .TextFormatterNamed(<span class="str">"Text Formatter"</span>) |
1 |
<span class="lnum"> 37: </span> . UsingTemplate(<span class="str">"Timestamp: {timestamp}{newline}Message: {message}{newline}Category: {category}{newline}"</span>)) |
1 |
<span class="lnum"> 38: </span> .ToFile(<span class="str">"d:\\logs\\ExceptionsLog.log"</span>) |
1 |
<span class="lnum"> 39: </span> .SendTo.RollingFile(<span class="str">"Rolling Log files"</span>) |
1 |
<span class="lnum"> 40: </span> .RollAfterSize(1024) |
1 |
<span class="lnum"> 41: </span> .ToFile(<span class="str">"d:\\logs\\Rollinglog.log"</span>) |
1 |
<span class="lnum"> 42: </span> .LogToCategoryNamed(<span class="str">"General"</span>) |
1 |
<span class="lnum"> 43: </span> .WithOptions.SetAsDefaultCategory() |
1 |
<span class="lnum"> 44: </span> .SendTo.SharedListenerNamed(<span class="str">"Exception Logging File"</span>); |
1 |
<span class="lnum"> 45: </span> |
1 |
<span class="lnum"> 46: </span> var configSource = <span class="kwrd">new</span> DictionaryConfigurationSource(); |
1 |
<span class="lnum"> 47: </span> builder.UpdateConfigurationWithReplace(configSource); |
1 |
<span class="lnum"> 48: </span> EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource); |
1 |
<span class="lnum"> 49: </span> |
1 |
<span class="lnum"> 50: </span> var ex = HttpContext.Current.Server.GetLastError(); |
1 |
<span class="lnum"> 51: </span> var em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>(); |
1 |
<span class="lnum"> 52: </span> em.HandleException(ex.InnerException, <span class="str">"MyPolicy"</span>); |
1 |
<span class="lnum"> 53: </span> } |
注意上面的代码, 为了运行代码您需要引用以下程序集 Enterprise Library Share Common LibraryMicrosoft.Practices.ServiceLocationLogging Application BlockException Handling Application BlockException Handling Logging Provider 这里我们使用Fluent API配置, 因此没有配置XML文件. 所以不需要Web.Config中配置任何信息. 代码中有注释. 为了测试我们使用一个PAGE故意Throw 一个ArgumentNullException. 通过Server.GetLastError()获取Exception, 这时由名为MyPolicy策略处理异常. 对于ArgumentNullException把它们记录日志到名为Exception分类中,这个日志文件位于d:\\logs\\ExceptionLog.log.实际开发你完全按照你的需要来自定义策略. 然后这个日志文件中写出的内容是这样的:
1 |
----------------------------------------Timestamp: 2011-11-12 5:57:08Message: HandlingInstanceID: a99d005d-5f8d-4613-9522-2d60efb089aaAn exception of type <span class="str">'System.ArgumentNullException'</span> occurred and was caught.----------------------------------------------------------------------------11/12/2011 13:57:08Type : System.ArgumentNullException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089Message : Value cannot be <span class="kwrd">null</span>.Parameter name: Demo errorSource : MyWebHelp link : ParamName : Demo errorData : System.Collections.ListDictionaryInternalTargetSite : Void Page_Load(System.Object, System.EventArgs)Stack Trace : at MyWeb.About.Page_Load(Object sender, EventArgs e) <span class="kwrd">in</span> H:\My Project\DotNet40\TDD2010\WebHost\MyWeb\About.aspx.cs:line 14 at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad(EventArgs e) at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)Additional Info:MachineName : USERTimeStamp : 2011-11-12 5:57:08FullName : Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35AppDomainName : 3e5cb21e-3-129655510216406250ThreadIdentity : WindowsIdentity : USER\PetterCategory: Exception |
由于我们日志模块我们配置还需要写Rollinglog.log文件,内容如下:
1 |
----------------------------------------Exception Warning: 9000 : Timestamp: 2011-11-12 5:57:08Message: HandlingInstanceID: a99d005d-5f8d-4613-9522-2d60efb089aaAn exception of type <span class="str">'System.ArgumentNullException'</span> occurred and was caught.----------------------------------------------------------------------------11/12/2011 13:57:08Type : System.ArgumentNullException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089Message : Value cannot be <span class="kwrd">null</span>.Parameter name: Demo errorSource : MyWebHelp link : ParamName : Demo errorData : System.Collections.ListDictionaryInternalTargetSite : Void Page_Load(System.Object, System.EventArgs)Stack Trace : at MyWeb.About.Page_Load(Object sender, EventArgs e) <span class="kwrd">in</span> H:\My Project\DotNet40\TDD2010\WebHost\MyWeb\About.aspx.cs:line 14 at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad(EventArgs e) at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)Additional Info:MachineName : USERTimeStamp : 2011-11-12 5:57:08FullName : Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35AppDomainName : 3e5cb21e-3-129655510216406250ThreadIdentity : WindowsIdentity : USER\PetterCategory: ExceptionPriority: 0EventId: 9000Severity: WarningTitle:Enterprise Library Exception HandlingMachine: USERApp Domain: 3e5cb21e-3-129655510216406250ProcessId: 2444Process Name: C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\WebDev.WebServer40.exeThread Name: Win32 ThreadId:2748Extended Properties: ---------------------------------------- |
1 |
你可以看到上面的EventId=9000与我们之前在CODE中配置是相同的. <br /> |
1 |
在开源社区有一个组件<a href="http://code.google.com/p/elmah/" target="_blank">ELMAH</a>(Error Logging Modules and Handlers for ASP.NET),已实现Error处理发邮件,写DB,发送到SNS等功能. 我们随意来看下它的代码:<br />它就是基于IHttpModule的扩展,下面代码来ELMAH: |
1 |
<span class="lnum"> 1: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 2: </span> <span class="rem">/// Provides an abstract base class for <see cref="IHttpModule"/> that</span> |
1 |
<span class="lnum"> 3: </span> <span class="rem">/// supports discovery from within partial trust environments.</span> |
1 |
<span class="lnum"> 4: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 5: </span> <span class="kwrd">public</span> <span class="kwrd">abstract</span> <span class="kwrd">class</span> HttpModuleBase : IHttpModule |
1 |
<span class="lnum"> 6: </span> { |
1 |
<span class="lnum"> 7: </span> <span class="kwrd">void</span> IHttpModule.Init(HttpApplication context) |
1 |
<span class="lnum"> 8: </span> { |
1 |
<span class="lnum"> 9: </span> <span class="kwrd">if</span> (context == <span class="kwrd">null</span>) |
1 |
<span class="lnum"> 10: </span> <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentNullException(<span class="str">"context"</span>); |
1 |
<span class="lnum"> 11: </span> |
1 |
<span class="lnum"> 12: </span> <span class="kwrd">if</span> (SupportDiscoverability) |
1 |
<span class="lnum"> 13: </span> HttpModuleRegistry.RegisterInPartialTrust(context, <span class="kwrd">this</span>); |
1 |
<span class="lnum"> 14: </span> |
1 |
<span class="lnum"> 15: </span> OnInit(context); |
1 |
<span class="lnum"> 16: </span> } |
1 |
<span class="lnum"> 17: </span> |
1 |
<span class="lnum"> 18: </span> <span class="kwrd">void</span> IHttpModule.Dispose() |
1 |
<span class="lnum"> 19: </span> { |
1 |
<span class="lnum"> 20: </span> OnDispose(); |
1 |
<span class="lnum"> 21: </span> } |
1 |
<span class="lnum"> 22: </span> |
1 |
<span class="lnum"> 23: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 24: </span> <span class="rem">/// Determines whether the module will be registered for discovery</span> |
1 |
<span class="lnum"> 25: </span> <span class="rem">/// in partial trust environments or not.</span> |
1 |
<span class="lnum"> 26: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 27: </span> <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">bool</span> SupportDiscoverability |
1 |
<span class="lnum"> 28: </span> { |
1 |
<span class="lnum"> 29: </span> get { <span class="kwrd">return</span> <span class="kwrd">false</span>; } |
1 |
<span class="lnum"> 30: </span> } |
1 |
<span class="lnum"> 31: </span> |
1 |
<span class="lnum"> 32: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 33: </span> <span class="rem">/// Initializes the module and prepares it to handle requests.</span> |
1 |
<span class="lnum"> 34: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 35: </span> <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnInit(HttpApplication application) {} |
1 |
<span class="lnum"> 36: </span> |
1 |
<span class="lnum"> 37: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 38: </span> <span class="rem">/// Disposes of the resources (other than memory) used by the module.</span> |
1 |
<span class="lnum"> 39: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 40: </span> <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnDispose() {} |
1 |
<span class="lnum"> 41: </span> } |
1 |
这是ErrorLogModule实现之前HttpModuleBase: |
1 |
<span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">class</span> ErrorLogModule : HttpModuleBase, IExceptionFiltering |
1 |
<span class="lnum"> 2: </span> { |
1 |
<span class="lnum"> 3: </span> <span class="kwrd">public</span> <span class="kwrd">event</span> ExceptionFilterEventHandler Filtering; |
1 |
<span class="lnum"> 4: </span> <span class="kwrd">public</span> <span class="kwrd">event</span> ErrorLoggedEventHandler Logged; |
1 |
<span class="lnum"> 5: </span> |
1 |
<span class="lnum"> 6: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 7: </span> <span class="rem">/// Initializes the module and prepares it to handle requests.</span> |
1 |
<span class="lnum"> 8: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 9: </span> |
1 |
<span class="lnum"> 10: </span> <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnInit(HttpApplication application) |
1 |
<span class="lnum"> 11: </span> { |
1 |
<span class="lnum"> 12: </span> <span class="kwrd">if</span> (application == <span class="kwrd">null</span>) |
1 |
<span class="lnum"> 13: </span> <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentNullException(<span class="str">"application"</span>); |
1 |
<span class="lnum"> 14: </span> |
1 |
<span class="lnum"> 15: </span> application.Error += <span class="kwrd">new</span> EventHandler(OnError); |
1 |
<span class="lnum"> 16: </span> ErrorSignal.Get(application).Raised += <span class="kwrd">new</span> ErrorSignalEventHandler(OnErrorSignaled); |
1 |
<span class="lnum"> 17: </span> } |
1 |
<span class="lnum"> 18: </span> |
1 |
<span class="lnum"> 19: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 20: </span> <span class="rem">/// Gets the <see cref="ErrorLog"/> instance to which the module</span> |
1 |
<span class="lnum"> 21: </span> <span class="rem">/// will log exceptions.</span> |
1 |
<span class="lnum"> 22: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 23: </span> <span class="kwrd">protected</span> <span class="kwrd">virtual</span> ErrorLog GetErrorLog(HttpContext context) |
1 |
<span class="lnum"> 24: </span> { |
1 |
<span class="lnum"> 25: </span> <span class="kwrd">return</span> ErrorLog.GetDefault(context); |
1 |
<span class="lnum"> 26: </span> } |
1 |
<span class="lnum"> 27: </span> |
1 |
<span class="lnum"> 28: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 29: </span> <span class="rem">/// The handler called when an unhandled exception bubbles up to </span> |
1 |
<span class="lnum"> 30: </span> <span class="rem">/// the module.</span> |
1 |
<span class="lnum"> 31: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 32: </span> <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnError(<span class="kwrd">object</span> sender, EventArgs args) |
1 |
<span class="lnum"> 33: </span> { |
1 |
<span class="lnum"> 34: </span> HttpApplication application = (HttpApplication) sender; |
1 |
<span class="lnum"> 35: </span> LogException(application.Server.GetLastError(), application.Context); |
1 |
<span class="lnum"> 36: </span> } |
1 |
<span class="lnum"> 37: </span> |
1 |
<span class="lnum"> 38: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 39: </span> <span class="rem">/// The handler called when an exception is explicitly signaled.</span> |
1 |
<span class="lnum"> 40: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 41: </span> <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnErrorSignaled(<span class="kwrd">object</span> sender, ErrorSignalEventArgs args) |
1 |
<span class="lnum"> 42: </span> { |
1 |
<span class="lnum"> 43: </span> LogException(args.Exception, args.Context); |
1 |
<span class="lnum"> 44: </span> } |
1 |
<span class="lnum"> 45: </span> |
1 |
<span class="lnum"> 46: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 47: </span> <span class="rem">/// Logs an exception and its context to the error log.</span> |
1 |
<span class="lnum"> 48: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 49: </span> <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> LogException(Exception e, HttpContext context) |
1 |
<span class="lnum"> 50: </span> { |
1 |
<span class="lnum"> 51: </span> <span class="kwrd">if</span> (e == <span class="kwrd">null</span>) |
1 |
<span class="lnum"> 52: </span> <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentNullException(<span class="str">"e"</span>); |
1 |
<span class="lnum"> 53: </span> |
1 |
<span class="lnum"> 54: </span> <span class="rem">//</span> |
1 |
<span class="lnum"> 55: </span> <span class="rem">// Fire an event to check if listeners want to filter out</span> |
1 |
<span class="lnum"> 56: </span> <span class="rem">// logging of the uncaught exception.</span> |
1 |
<span class="lnum"> 57: </span> <span class="rem">//</span> |
1 |
<span class="lnum"> 58: </span> |
1 |
<span class="lnum"> 59: </span> ExceptionFilterEventArgs args = <span class="kwrd">new</span> ExceptionFilterEventArgs(e, context); |
1 |
<span class="lnum"> 60: </span> OnFiltering(args); |
1 |
<span class="lnum"> 61: </span> |
1 |
<span class="lnum"> 62: </span> <span class="kwrd">if</span> (args.Dismissed) |
1 |
<span class="lnum"> 63: </span> <span class="kwrd">return</span>; |
1 |
<span class="lnum"> 64: </span> |
1 |
<span class="lnum"> 65: </span> <span class="rem">//</span> |
1 |
<span class="lnum"> 66: </span> <span class="rem">// Log away...</span> |
1 |
<span class="lnum"> 67: </span> <span class="rem">//</span> |
1 |
<span class="lnum"> 68: </span> |
1 |
<span class="lnum"> 69: </span> ErrorLogEntry entry = <span class="kwrd">null</span>; |
1 |
<span class="lnum"> 70: </span> |
1 |
<span class="lnum"> 71: </span> <span class="kwrd">try</span> |
1 |
<span class="lnum"> 72: </span> { |
1 |
<span class="lnum"> 73: </span> Error error = <span class="kwrd">new</span> Error(e, context); |
1 |
<span class="lnum"> 74: </span> ErrorLog log = GetErrorLog(context); |
1 |
<span class="lnum"> 75: </span> <span class="kwrd">string</span> id = log.Log(error); |
1 |
<span class="lnum"> 76: </span> entry = <span class="kwrd">new</span> ErrorLogEntry(log, id, error); |
1 |
<span class="lnum"> 77: </span> } |
1 |
<span class="lnum"> 78: </span> <span class="kwrd">catch</span> (Exception localException) |
1 |
<span class="lnum"> 79: </span> { |
1 |
<span class="lnum"> 80: </span> <span class="rem">//</span> |
1 |
<span class="lnum"> 81: </span> <span class="rem">// IMPORTANT! We swallow any exception raised during the </span> |
1 |
<span class="lnum"> 82: </span> <span class="rem">// logging and send them out to the trace . The idea </span> |
1 |
<span class="lnum"> 83: </span> <span class="rem">// here is that logging of exceptions by itself should not </span> |
1 |
<span class="lnum"> 84: </span> <span class="rem">// be critical to the overall operation of the application.</span> |
1 |
<span class="lnum"> 85: </span> <span class="rem">// The bad thing is that we catch ANY kind of exception, </span> |
1 |
<span class="lnum"> 86: </span> <span class="rem">// even system ones and potentially let them slip by.</span> |
1 |
<span class="lnum"> 87: </span> <span class="rem">//</span> |
1 |
<span class="lnum"> 88: </span> |
1 |
<span class="lnum"> 89: </span> Trace.WriteLine(localException); |
1 |
<span class="lnum"> 90: </span> } |
1 |
<span class="lnum"> 91: </span> |
1 |
<span class="lnum"> 92: </span> <span class="kwrd">if</span> (entry != <span class="kwrd">null</span>) |
1 |
<span class="lnum"> 93: </span> OnLogged(<span class="kwrd">new</span> ErrorLoggedEventArgs(entry)); |
1 |
<span class="lnum"> 94: </span> } |
1 |
<span class="lnum"> 95: </span> |
1 |
<span class="lnum"> 96: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 97: </span> <span class="rem">/// Raises the <see cref="Logged"/> event.</span> |
1 |
<span class="lnum"> 98: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 99: </span> <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnLogged(ErrorLoggedEventArgs args) |
1 |
<span class="lnum"> 100: </span> { |
1 |
<span class="lnum"> 101: </span> ErrorLoggedEventHandler handler = Logged; |
1 |
<span class="lnum"> 102: </span> |
1 |
<span class="lnum"> 103: </span> <span class="kwrd">if</span> (handler != <span class="kwrd">null</span>) |
1 |
<span class="lnum"> 104: </span> handler(<span class="kwrd">this</span>, args); |
1 |
<span class="lnum"> 105: </span> } |
1 |
<span class="lnum"> 106: </span> |
1 |
<span class="lnum"> 107: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 108: </span> <span class="rem">/// Raises the <see cref="Filtering"/> event.</span> |
1 |
<span class="lnum"> 109: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 110: </span> <span class="kwrd">protected</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> OnFiltering(ExceptionFilterEventArgs args) |
1 |
<span class="lnum"> 111: </span> { |
1 |
<span class="lnum"> 112: </span> ExceptionFilterEventHandler handler = Filtering; |
1 |
<span class="lnum"> 113: </span> |
1 |
<span class="lnum"> 114: </span> <span class="kwrd">if</span> (handler != <span class="kwrd">null</span>) |
1 |
<span class="lnum"> 115: </span> handler(<span class="kwrd">this</span>, args); |
1 |
<span class="lnum"> 116: </span> } |
1 |
<span class="lnum"> 117: </span> |
1 |
<span class="lnum"> 118: </span> <span class="rem">/// <summary></span> |
1 |
<span class="lnum"> 119: </span> <span class="rem">/// Determines whether the module will be registered for discovery</span> |
1 |
<span class="lnum"> 120: </span> <span class="rem">/// in partial trust environments or not.</span> |
1 |
<span class="lnum"> 121: </span> <span class="rem">/// </summary></span> |
1 |
<span class="lnum"> 122: </span> <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">bool</span> SupportDiscoverability |
1 |
<span class="lnum"> 123: </span> { |
1 |
<span class="lnum"> 124: </span> get { <span class="kwrd">return</span> <span class="kwrd">true</span>; } |
1 |
<span class="lnum"> 125: </span> } |
1 |
<span class="lnum"> 126: </span> } |
1 |
更多的功能等待您去挖掘,我们在实际开发中按需选择.希望这篇POST对您开发有帮助.<br /> |
转自:http://www.cnblogs.com/wintersun/archive/2011/11/12/2246513.html
View Detailsasp.net向文本文件txt末尾追加内容
using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls; using System.IO; public partial class _Default : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { string Path = Server.MapPath("1.txt"); string strings = "1232222"; FileAdd(Path, strings); } public static void FileAdd(string Path, string strings) { //实现一个System.IO.StreamWrite,使其以一种特定的编码向流中写入数据,AppendText数据追加到文件末尾 //这句也可以写成StreamWriter sw = new StreamWriter(Path, true, Encoding.GetEncoding("GB2312")); StreamWriter sw = File.AppendText(Path); //开始写入 sw.WriteLine(strings); //清理当前编码器的缓冲区,并将所有缓存数据写入基础流 sw.Flush(); sw.Close(); } } 转自:http://blog.sina.com.cn/s/blog_812ce0500100ywjb.html
View DetailsASP.NET Global.ascx 事件大全
Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法。你可以使用这个文件实现应用程序安全性以及其它一些任务。下面让我们详细看一下如何在应用程序开发工作中使用这个文件。 概述Global.asax 位 于应用程序根目录下。虽然 Visual Studio .NET 会自动插入这个文件到所有的 ASP.NET 项目中,但是它实际上是一个可选文件。 删除它不会出问题——当然是在你没有使用它的情况下。.asax 文件扩展名指出它是一个应用程序文件,而不是一个使 用 aspx 的 ASP.NET 文件。Global.asax 文件被配置为任何(通过 URL 的)直接 HTTP 请求都被自动 拒绝,所以用户不能下载或查看其内容。ASP.NET 页面框架能够自动识别出对Global.asax 文件所做的任何更改。 在 Global.asax 被更改后ASP.NET 页面框架会重新启动应用程序,包括关闭所有的浏览器会话,去除所有状态信息,并重新启动应用程序 域。 编程Global.asax 文件继承自HttpApplication 类,它维护一个HttpApplication 对象池,并在需要时将对象池中的对象分配给应用程序。Global.asax 文件包含以下事件:Application_Init:在应用程序被实例化或第一次被调用时,该事件被触发。对于所有的HttpApplication 对象实例,它都会被调用。Application_Disposed:在应用程序被销毁之前触发。这是清除以前所用资源的理想位置。Application_Error:当应用程序中遇到一个未处理的异常时,该事件被触发。Application_Start:在HttpApplication 类的第一个实例被创建时,该事件被触发。它允许你创建可以由所有HttpApplication 实例访问的对象。Application_End:在HttpApplication 类的最后一个实例被销毁时,该事件被触发。在一个应用程序的生命周期内它只被触发一次。Application_BeginRequest:在接收到一个应用程序请求时触发。对于一个请求来说,它是第一个被触发的事件,请求一般是用户输入的一个页面请求(URL)。Application_EndRequest:针对应用程序请求的最后一个事件。Application_PreRequestHandlerExecute:在 ASP.NET 页面框架开始执行诸如页面或 Web 服务之类的事件处理程序之前,该事件被触发。Application_PostRequestHandlerExecute:在 ASP.NET 页面框架结束执行一个事件处理程序时,该事件被触发。Applcation_PreSendRequestHeaders:在 ASP.NET 页面框架发送 HTTP 头给请求客户(浏览器)时,该事件被触发。Application_PreSendContent:在 ASP.NET 页面框架发送内容给请求客户(浏览器)时,该事件被触发。Application_AcquireRequestState:在 ASP.NET 页面框架得到与当前请求相关的当前状态(Session 状态)时,该事件被触发。Application_ReleaseRequestState:在 ASP.NET 页面框架执行完所有的事件处理程序时,该事件被触发。这将导致所有的状态模块保存它们当前的状态数据。Application_ResolveRequestCache:在 ASP.NET 页面框架完成一个授权请求时,该事件被触发。它允许缓存模块从缓存中为请求提供服务,从而绕过事件处理程序的执行。Application_UpdateRequestCache:在 ASP.NET 页面框架完成事件处理程序的执行时,该事件被触发,从而使缓存模块存储响应数据,以供响应后续的请求时使用。Application_AuthenticateRequest:在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证。Application_AuthorizeRequest:当安全模块确认一个用户可以访问资源之后,该事件被触发。Session_Start:在一个新用户访问应用程序 Web 站点时,该事件被触发。 Session_End:在一个用户的会话超时、结束或他们离开应用程序 Web 站点时,该事件被触发。Application_Error 事件显示一个简单的消息用以说明发生的错误。 这个事件列表看起来好像多得吓人,但是在不同环境下这些事件可能会非常有用。使用这些事件的一个关键问题是知道它们被触发的顺序。Application_Init 和Application_Start 事件在应用程序第一次启动 时被触发一次。相似地,Application_Disposed 和 Application_End 事件在应用程序终止时被触发一次。此外,基于会 话的事件(Session_Start 和 Session_End)只在用户进入和离开站点时被使用。其余的事件则处理应用程序请求,这些事件被触发的 顺序是:Application_BeginRequestApplication_AuthenticateRequestApplication_AuthorizeRequestApplication_ResolveRequestCacheApplication_AcquireRequestStateApplication_PreRequestHandlerExecuteApplication_PreSendRequestHeadersApplication_PreSendRequestContent<<执行代码>>Application_PostRequestHandlerExecuteApplication_ReleaseRequestStateApplication_UpdateRequestCacheApplication_EndRequest 这些事件常被用于安全性方面。 转自:http://www.cnblogs.com/xiaopin/archive/2010/08/31/1813747.html
View Details[转]Asp.net中的web.config配置
web.config是asp.net中保存配置信息(比如数据库连接字符串等)的重要文件。它是基于xml的文本文件方式放在Web应用程序的任何目录中,并且默认不随源文件编译到Dll中,而运行环境随时监视着它是否有改变,一但有变动,系统会自动重新加载里面的最新内容。 一、 配置文件保存位置 .net的默认配置文件保存在“windows目录\Microsoft.NET\Framework\对应.net版本\config”文件夹下面。不同的操作系统windows目录不一样,我们在命令行下输入“echo %windir%”查看windows目录所在的位置。 图:web.config所在的目录 Asp.net中有两个非常重要的配置文件,分别是machine.config和web.config,它们都位于config文件夹下面。这两个文件一般不需要我们手工是维护它,保持默认即可。但针对asp.net应用程序,它自身会有0个,1个或者多个web.config配置文件,多个配置文件会存在加载顺序问题。下节会介绍。 注意,传说中.net3.0和.net3.5只是在.net2.0的基础上扩充中,所以还是没用的.net2.0的配置文件。它们连config这个目录都没有。 二、 配置文件加载顺序 IIS在Asp.net网站启动时,会加载配置文件中的配置信息,然后缓存这些信息,不会每次要用都去读取配置文件,只是IIS会随时监视着这些文件的变化,一量有变化,它会重新去读取并缓存配置信息。 Asp.net网站运行时会按照以下方式加载配置文件中的节点信息: 1) 如果在当前运行页面所在的目录下有web.config文件,则查找是否存在所需要的节点,如果存在则返回结果,并停止下一步地查找。 2) 如里所在目录不存在web.config配置或者配置文件里没有所需要的节点,则查找它所在的上一级目录的配置文件中的节点,直到网站根目录。(问题:IIS6中的虚拟目录算不算根目录) 3) 如果网站根目录中都不存在web.config或者所需要的配置节点,转而到“windows目录\Microsoft.NET\Framework\对应.net版本\config\web.config”中去查找。 4) 如果第3条中还没找到,继续到“windows目录\Microsoft.NET\Framework\对应.net版本\config\machine.config”中去查找。 5) 如果还没找到,那就报错吧。 存在两个问题 1) IIS6中的虚拟目录算不算根目录。 2) 在系统运行时,在一个原本没有web.config的目录中手工加上一个web.config,会不会自动加载。 三、 配置文件节点介绍 Web.config文件是一个xml文本文件,它的根节点为<configuration>,该节点下包含常见的子节点有:<configSections>、<appSettings>、<connectionStrings>(保存数据库连接字符串)、<location>和<system.web>。下面针对各节点配置进行介绍。 1. <configSections> configSections 元素指定了配置节和处理程序声明。由于 ASP.NET 不对如何处理配置文件内的设置作任何假设,因此这非常必要。但 ASP.NET 会将配置数据的处理委托给配置节处理程序。配置结构信息如下: <configSections> <!--定义配置节处理程序与配置元素之间的关联。--> <section /> <!--定义配置节处理程序与配置节之间的关联。--> <sectionGroup /> <!--移除对继承的节和节组的引用。--> <remove /> <!--移除对继承的节和节组的所有引用,只允许由当前 section 和 sectionGroup 元素添加的节和节组。--> <clear/> </configSections> 每个 section 元素标识一个配置节或元素以及对该配置节或元素进行处理的关联 ConfigurationSection 派生类。可以在 sectionGroup 元素中对 section 元素进行逻辑分组,以对 section 元素进行组织并避免命名冲突。section 和 sectionGroup 元素包含在 configSections 元素中。 如果配置文件中包含 configSections 元素,则 configSections 元素必须是 configuration 元素的第一个子元素。 下面我们来示例写一个自定义配置信息,并完成它的SectionHandler,首先我们在<configuration>节点下添加configSections。 <configuration> <configSections> <sectionGroup name="mySectionGroup"> <section name="mySection" requirePermission="true" type="ConfigTest.SectionHandler.MySectionHandler,ConfigTest.SectionHandler" /> […]
View Details为程序员准备的7个国外社交网站
ForrstForrest是为开发人员和设计师提供的一个新兴的地方,在这里可以分享代码和截图以及链接,启发你的灵感。如果你曾想为你的一块代码获得一些专业实诚 的建议;如果你在几个logo中没法做出决定的时候,Forrst正好适合你。此社区正处扩张期,仍然以邀请的方式注册,但我还是强烈推荐给你,没有什么 比在这个全新的站点受欢迎更好的事了。 Twitter如果你仍然认为Twitter只是一个提供给小女孩讨论关于贾斯汀比伯发烧友的推文的地方的话,或许你这么想也是对的,但除此之外,软件开发者在这里分享 他们一些有趣的产品和最新的趣闻。Twitter是我了解新闻的汇集地,如果有看到同样的故事被多个人推送,通常我会进一步研究,如果你关注对了人的话, 推文无疑是一种很重要的保持联系地方式。 Blog现在估计你会说”疯了吧,我不想拥有博客,我不是那种喜欢分享一切甚至将来死了还希望能有一部电影是写关于自己的时髦人。虽然博客是有特定类型的人做白日 梦的地方,但它仍然允许你分享一些很酷的东西。这是记录你作为程序员生涯和人类生存的整个过程,甚至能够为你的未来开启一扇大门。 Github你的代码保存在硬盘上不让任何人使用那将会发生什么事情呢?它永远也不会被运行或者用于其他用途,在我的思维中这是一种彻彻底底的失败,上Guthub,把你的代码免费公开出来,同时是一种学习新事物的好方法,现在就选择一门熟悉的语言开始阅读吧。 Stackoverflow你是属于那种问一大堆问题然后期待答案的那类人吗?Stackoverflow这个最优秀的Q&A站点开始出现在网络上,它有各种姊妹站点,想知道更多关于食谱、编码、Ubuntu、或者即使是新事物。这里有海量的知识库,我推荐给任何想知道更多东西的开发者。 HackerNews你有想过大批聪明的开发者愿意发送技术文章和趣事链接到新闻站点上吗?准备一天花费一小时轻松点击刷新,赶紧检查下吧。 Reddit现在你可能认为Reddit主要是用于查找有关猫的一些趣图和利用人性弱点制造娱乐的地方,然而有大批的开发者开始在讨论各种搞破坏的开发,在subreddit还能找到更多的方法。 CoderWall我知道我说了7种但是不能遗漏coderwall,我们喜欢竞争,记录一些成就,CoderWall为我们提供了这样的平台。他们最近发布一个新的描述页面,看起来很棒,试试吧。 原文:Mahdi Yusuf 编译:伯乐在线 –刘志军
View Details解决.Net 4.0 A potentially dangerous Request.Form value was detected from the client 异常
本文From hongshengpeng 解决ASP.NET 4.0 "A potentially dangerous Request.Form value was detected from the client". 错误在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值。立马报错。(在.aspx文件头中加入这句: <%@ Page validateRequest="false" %>,但还是出现相同错误) 或是修改web.config文件: <configuration> < system.web> <pages validateRequest="false" /> < /system.web> < /configuration> 但错误依旧。对.NET 4.0, 应该加上requestValidationMode="2.0" to the httpRuntime configuration section of the web.config :<httpRuntime requestValidationMode="2.0"/>(这句重要) 结构:<configuration> <system.web> <httpRuntime requestValidationMode="2.0">
View Details【转】程序之路,褪去浮躁
偶然之间在网上发现的一段话,感觉挺好,短短的二十几点指向,引导一个程序菜鸟走向程序高手的航标,其实做程序没有什么捷径,只有自己不断的去学习,不断的去接受新知识,不断的开拓自己的思路,只有自己的想法,思维新颖,加上不断累计的基本功,才会写出好的程序; 我们来看看高手是如何引导我们去踏寻程序之路ing: 1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异。2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的。3.看帮助,不要因为很难而自己是初学者所以就不看;帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,总觉得不够直观。4.不要被对象、属性、方法等词汇所迷惑;最根本的是先了解最基础知识。5.不要放过任何一个看上去很简单的小问题--他们往往并不那么简单,或者可以引伸出很多知识点;不会举一反三你就永远学不会。6.知道一点东西,并不能说明你会编程,编程是需要经验积累的。7.学编程并不难,ASP、PHP、Java和C#等等也不过如此--难的是长期坚持实践和不遗余力的博览群书;8.看再多的书是学不全编程的,要多实践;9.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;10.学习编程最好的方法之一就是多练习;11.在任何时刻都不要认为自己手中的书已经足够了;12.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;13.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;14.请把书上的例子亲手到电脑上实践,即使配套光盘中有源文件;15.把在书中看到的有意义的例子扩充;并将其切实的运用到自己的工作中;16.不要漏掉书中任何一个练习——请全部做完并记录下思路;17.当你写代码到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个代码的完整性,然后分析自己的错误并重新编写和工作;18.别心急,写代码确实不容易;水平是在不断的实践中完善和发展的;19.每学到一个知识难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;20.记录下在和别人交流时发现的自己忽视或不理解的知识点;21.保存好你做过的所有的源文件—-那是你最好的积累之一;22.对于网络,还是希望大家能多利用一下,很多问题不是非要到论坛来问的,首先你要学会自己找答案,比如google、百度都是很好的搜索引擎,你只要输入关键字就能找到很多相关资料,别老是等待别人给你希望,看的出你平时一定也很懒!23,到一个论坛,你学会去看以前的帖子,不要什么都不看就发帖子问,也许你的问题早就有人问过了,你再问,别人已经不想再重复了,做为初学者,谁也不希望自己的帖子没人回的。24,虽然不是打击初学者,但是这句话还是要说:论坛论坛,就是大家讨论的地方,如果你总期望有高手总无偿指点你,除非他是你亲戚!!讨论者,起码是水平相当的才有讨论的说法,如果水平真差距太远了,连基本操作都需要别人给解答,谁还跟你讨论呢。25,不要指望看过一两本书之后没有太多基础的你就能成为绝顶高手,也不管写书的那个人是怎样的绝顶高手,事实上那是不可能的,没有长时间的实践和练习是不会成为高手的。 26,不要因为太简单而不做,要知道大画家达芬奇是从学画鸡蛋开始他的画家生涯的。 27,不要一遇到个错误就害怕得不得了,所谓的高手只不过是错得比你多一些,在总结之后经验比你丰富一些而已。 浮躁的人容易问:我到底该学什么;—-别问,学就对了;浮躁的人容易问:学脚本有"钱"途吗;—-建议你去抢银行;浮躁的人容易说:我要中文版!我英文不行!—-不行?学呀!浮躁的人分两种:只观望而不学的人;只学而不坚持的人;浮躁的人永远不是一个高手。 转自:http://www.cnblogs.com/zhuifengnianshao/archive/2010/11/10/1874165.html
View DetailsEclipse3.7中搭建Android开发环境
1、下载Eclipse3.7,登录http://www.eclipse.org/downloads/,下载Eclipse Classic 3.7: 2、安装ADT插件:下载好Eclipse后解压,运行Eclipse,第一次运行会提示设置workspace;在菜单栏选择Help—Install New Software,在Work with栏输入http://dl-ssl.google.com/android/eclipse/并回车,稍后显示如下图: 选择Select All按钮,单击Next——Next,选中“I Accept (此处略去若干字)”,再单击Finish,开始安装插件: 安装期间会提示“Warning(此处略去若干字)”,选择OK。安装完成后选择Restart,重启Eclispe。 此时选择Window,会出现如下选项: 并且Preference窗口中会出现Android选项,说明ADT插件安装成功。 3、安装Android SDK:登录http://developer.android.com/sdk/index.html,下载android-sdk_r12-windows.zip: 得到的是一个压缩包,解压到D盘根目录下。这里请注意,解压之后的SDK Manager.exe文件的绝对地址不要带有空格,否则后面启动模拟器的时候会有如下报错: invalid command-line parameter: Files\android-sdk-windows\tools/emulator-arm.exe.Hint: use '@foo' to launch a virtual device named 'foo'.please use -help for more information 这里文件的绝地地址是D:\android-sdk-windows\SDK Manager.exe。 4、运行D:\android-sdk-windows\SDK Manager.exe,会自动检查更新。我们下载的android-sdk_r12-windows.zip仅仅是冰山一角,我们还要下载安装整个冰山。 在上图中,你可以直接选择Install或者选择Accept All之后再选择Install。我是全选的,接下来的安装过程持续了几个小时,一定要淡定。 5、安装完毕后,关闭SDK Manager.exe。运行Eclipse,选择Window——Preference——Android,在SDK Location选择D:\android-sdk-windows,单击Apply后在Target Name中选择Android 2.3.3,单击OK,以关闭Preference对话框。 6、创建Android模拟器:在Eclipse中选择Window——Android SDK and AVD Manager,在对话框的左边选中Virtual decices,单击右部的New按钮(你可能需要把对话框拉宽才能看见这个按钮),仿照下图填写参数: 单击Create AVD按钮,完成模拟器的创建。 7、在Android SDK and AVD Manager窗口选中Android2.3.3,单击Start,弹出对话框以设定参数。为了使模拟器大小适中,可以仿照下图填写参数: 设定参数后,单击Launch,启动模拟器: 上图显示的模拟器我进行了一些设置,如时区选择、语言选择。 至此,环境搭建完毕,可以进行开发了。 转自:http://my.oschina.net/plumsoft/blog/29283
View Details互联网世界 9 种基本的商业模式
一个商业模式是运行一个公司的方法;通过该模式的运作,一个公司能维持自己的生存,就是说,能有收益。商业模式意味着一个公司是如何通过在价值链中定位自己,从而获得收益的。就电子商务而言,人们倾向于重用经过检验而可靠的模式。 商业模式可能是网络上讨论得最多、理解得最少的一个内容。有关网络是如何改变传统商业模式的讨论很多,但是对它的含义却很少能有清晰的表达。 从最基本的方面讲,一个商业模式是运行一个公司的方法;通过该模式的运作,一个公司能维持自己的生存,就是说,能有收益。商业模式意味着一个公司是如何通过在价值链中定位自己,从而获得收益的。 一 些模式相当简单:公司供应产品或服务,并将他们卖给客户。如果一切顺利,盈利就是销售收入超过运营成本的部分,公司也因此获利。而有一些模式则更加错综复 杂些,广播即是一个例子。广播和电视节目通过电波传输,都是免费发送给拥有接收器的任何人,自上半个世纪一直如此。广播公司则是由发行人、内容供应商、广 告商(及其代理)、听众或者观众这样一个复杂网络的一环。一开始,谁赚钱,赚多少钱并不是很清楚,这个问题的底线往往依赖于许多竞争因素。 电 子商务将为商业模式增加许多新的种类,这点毋庸置疑。但是,在网络上人们倾向于重用经过检验而可靠的模式,拍卖就是最好的例子。作为古老的代理形式之一, 拍卖已经在世界范围内广为使用,以确定以下物品的价格:农产品、金融产品、一些唯一的产品,像高品质的艺术品或者古玩。网络使拍卖模式变得非常流行,并且 在网络上使它的应用扩展到了更大范围的物品和服务中。 人们用很多形式对商业模式下定义、做分类。以下,我就多年来网上的观察,尝试给出一个全面而可靠的分类形式。以下列出的分类形式并非权威或者绝对的。由于网络商业模式仍然在进化,我们可以期待将来出现新的和有趣的变化。 基本的商业模式分类见下面的表中列出: 代理模式 (Brokerage) 广告模式 (Advertising) 信息中介 (Infomediary) 商户模式 (Merchant) 厂家直销 (Direct Manufacturer) 会员营销 (Affiliate) 社区形式 (Community) 订阅模式 (Subscription) 效用模式 (Untility) 人们通过各种各样的方法实践以上模式,再者,一家公司出于网上营销的全局策略,往往会综合多种不同的商业模式。例如,内容驱动的商业,往往将广告和订阅模式揉在一块。 近 来,商业模式以拥有专利保护的知识产权形式出现,更加获得人们的重视。事实上,商业模式(或者更通俗的说“经营方式”)在专利法律的保护下,变得越来越没 落。大量和电子商务相关的商业方法专利仍然获得授权保护,但对于新颖的商业模式却未必是清晰的。其中一些广为人知的专利,可能在法庭上将会面临质疑。 模式类型: 详细描述: 代理模式 代理商是市场的缔造者:他们把买方和卖方撮合在一起,并且推动交易行为 。交易的双方可以是企业-企业,企业-消费者,或消费者-消费者市场。代理从他撮合成功的每项交易中收取一定的费用。佣金的计算方式因人而异。代理模式常见以下样例类型: 市 场交换(Market Exchange):提供涉及交易的全面服务环节,从市场评估到价格谈判及合同执行。交易中心或独立运营,或由多家企业联营。这是在B2B市场中不断被应 用的通用模式。 好的例子如MetalSite ,ChemConnect’s World Chemical Exchange。在此交换模 型中,典型地,代理向卖方收取基于销售额的一个交易费用。价格机制可以是一个简单的出价/购买(offer/buy),出价/协议购买(offer /negotiated buy), 或者是一个拍卖的出价/投标的处理方法(auction offer/bid approach)。[Orbitz, ChemConnect] 买 /卖履行(Buy/Sell Fulfillment)-这可以是一个在线的金融代理,类似 于eTrade用户发出买和卖订单,进行金融设备的交易。同样地,旅游代理也符合这个种类。在这种模式中,代理向买方和/或卖方收取交易费用。有些模式基 于规 模经营,用很低的费用就可以发送出最好的交易价格,[CarsDirect, Respond.com] 需 求搜集系统(Demand Collection System)-它的专利名叫“报出你的价”,其模式由Priceline.com公司首创。预期的购买者为某一商品或服务报出最终价格,代理则为他寻求 相应的卖家。在某些模式中,代理收取的费用是报价和成交价之间的差额,或者是一个处理费用。通常,这种模式的目标定位于一些高档的物品,如 汽车,或飞机票等。[Priceline.com] 拍卖代理(Auction Broker)-为卖方(个人或商家)处理拍卖的站点。以一个最低点为基础, 卖方从购买者那里获得最高投标金额。拍卖根据报价和出价规则的不同而有所不同。[eBay] 交易代理(Transaction Broker)-为买卖双方解决交易问题,提供第三方安全支付机制。[PayPal, Escrow.com] 批 发商(Distributor)-仅维护一个分类目录,将大量的产品生产商和零售买家撮合在一块。代理商方便了特许代理商和他们贸易伙伴的商务交易。对于 购买者,可以使他们更快地进行市场交易,更快地获取批量,同时,降低获取成本。为购买者提供来自于最好的分销商的报价、显示 特定购买者的价格、交易时间,并推荐次分销商–使交易更加有效。对于分销商,通过报价、订单处理、跟踪订单状态,使分销商更快地适应变化,减少劳动力, 从而降低销售成本。 搜索代理(Search Agent)–使用一个代理(如,一个智能软件或”机器人” ),为购买者指定的一项商品或服务搜索出最好的价格,或者努力定位发现信息。一个工作代理,够扮演一个搜索代理人,为求职者寻找工作,或为招聘者列出的职位寻找 合适的求职者。 虚 拟市场(Virtual Marketplace)-招待许多商家的站点。典型地,商场收取初建费、每月列表 费和/或每次的交易费。如果虚拟商场具有一个一般化的门户入口,那么它就能被非常有效地实现。更加复杂的商场,将提供自动交易服务和关联市场机会的服务。 [zShops and Merchant Services at Amazon.com] 广告模式 网 络广告模式,拓展了传统的广告媒体。此刻的传播商通常是一个网站,在提供的内容(常常但并非必须是免费的)和服务(像邮件,即时通讯,博客)时, 常加入些条幅广告信息。这些条幅广告可能是这个传播商的主要或者唯一的收入来源。传播商可能是内容的创建者或者内容的发行人。只有当浏览量非常大或者高度 专业化时,广告模式才能正常运作。 门户(Portal)-通常指能够找到各类内容或者服务的搜索引擎。大量的访问流量让广告有利可图,而且要求网站的服务更多样化。个性化门户,允许用户定制其界面和内容。而细分门户则精心培育明确的用户群。分为一般化、个性化和专业化三类门户网站。[Yahoo!] […]
View Details