当前位置: 首页 > news >正文

建立个人网站用虚拟主机软件技术的发展趋势

建立个人网站用虚拟主机,软件技术的发展趋势,wordpress返回前页,自己建网址在这个文章里#xff0c;我将分享一下在iOpenWorks.com这个网站试运行中碰到的若干问题和解决方案#xff0c;这些问题包含了#xff1a;#xff08;1#xff09;如何通过ASP.NET MVC预编译提高性能#xff1b;#xff08;2#xff09;如何知道网站在运行中#xff0c… 在这个文章里我将分享一下在iOpenWorks.com这个网站试运行中碰到的若干问题和解决方案这些问题包含了1如何通过ASP.NET MVC预编译提高性能2如何知道网站在运行中用户响应速度、网站异常信息、用户操作习惯3解决与DiscuzToolkit集成的线程同步问题。   1 ASP.NET MVC 3预编译支持 提高网站性能除了我们常见的压缩、CDN、缓存之外还有一个就是使用预编译。不管是ASP.NET WebForm或者是ASP.NET MVC这些页面在网站运行过程中都是要先经过编译处理的。因此如果能在网站运行前对其进行编译那无疑能更好的提高网站的响应速度。因此我们选择了一个RazorGenerator来对所有的ASP.NET MVC 3的视图进行编译这样在部署时仅需要将dll文件拷贝过去而不再需要cshtml文件了。下面介绍如何使用它来实现预编译。 1.1 下载安装RazorGenerator 你可以在http://razorgenerator.codeplex.com/下载到RazorGenerator这是一个VS 2010的扩展。下载完成后就可以直接安装了。接着你还需要下载源代码然后编译一下获取编译的RazorGenerator.Mvc.dll程序集。   1.2 改变视图文件的生成方式 将所有的视图的BuildAction改成None并且将CustomTool改成RazorGenerator这时候你可以看到一个关联的.generated.cs文件这个文件就是预编译的源码文件了。 1.3 处理Helper 对于Helpr文件处理方式有所不同。Helper文件一般放在App_Code文件夹里面。首先你需要在Helper文件的第一行添加 * Generator: MvcHelper * 来声明一下接着将BuildAction改成None并且将CustomTool改成RazorGenerator 下面还需要额外一个步骤这个非常重要否则编译无法通过那就是需要将.generated.cs文件的BuildAction由Content改为Compile。   1.4 注册PrecompiledMvcEngine 下面我们在ASP.NET MVC 3项目中引用RazorGenerator.Mvc.dll这个程序集然后定义一个PreApplicationStartCode并在AssemblyInfo.cs文件中注册这个PreApplicationStartCode。这样我们就注册了PrecompiledMvcEngine了。 1在AssemblyInfo.cs注册   [assembly: PreApplicationStartMethod(      typeof(UIShell.iOpenWorks.PreApplicationStartCode), PreStart)]   2PreApplicationStartCode定义   namespace UIShell.iOpenWorks  {      public class PreApplicationStartCode      {          private static bool _isStarting;         public static void PreStart()          {              if (!_isStarting)              {                  _isStarting  true;                 var engine  new PrecompiledMvcEngine(                      typeof(PreApplicationStartCode).Assembly);                 ViewEngines.Engines.Add(engine);                 VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);              }          }      }  }     1.5 部署 这时候部署网站就不再需要将视图文件部署过去了只需要拷贝dll文件和网站资源。注意在Views下面已经没有.cshtml文件了也没有App_Code文件因为它们都被预编译到了UIShell.iOpenWorks.dll这个程序集了。接下来你就可以测试一下网站享受一下预编译带来的性能提升了。   2 跟踪网站运行情况 网站在内测期间会碰到较多的问题。但是这时候用户已经进来测试你怎么能够及时发现用户响应速度、用户访问过程中网站异常信息以及用户是如何来使用你的网站。这里我们使用了log4net这个日志组件它用于记录1用户访问了哪些页面2用户在访问页面过程中碰到了哪些异常3每一个页面的响应速度。下面我来介绍如何记录这些信息的。 2.1 在Global中跟踪每个用户访问的页面并且要记录用户响应的速度   [ThreadStatic] private static Stopwatch _stopwatch;protected void Application_BeginRequest()  {      _stopwatch  Stopwatch.StartNew();  // 计时开始     if (DiscuzHelper.IsLoggedIn()) // 记录当前用户     {          try          {              var user  DiscuzHelper.LoggedUser();              if(user ! null)              {                  ThreadContext.Properties[user]  user.UserName;                  return;              }          }          catch (Exception ex)          {              _logger.Error(Failed to get the user name though the user is logged in., ex);          }      }                   ThreadContext.Properties[user]  string.Empty;     if (Request ! null) // 记录当前用户的IP     {          ThreadContext.Properties[ipaddress]  Request.ServerVariables[REMOTE_ADDR];      }      else      {          ThreadContext.Properties[ipaddress]  string.Empty;      }  }protected void Application_EndRequest()  {      if (Request ! null  _stopwatch ! null  _logger ! null)  // 计时结束就用户响应时间和访问页面     {          _stopwatch.Stop();          _logger.Debug(string.Format(Accessed page Response time: {0} ms, Url: {1}., _stopwatch.ElapsedMilliseconds, Request.Url));      }  }   2.2 在Global中记录系统的异常   void Application_Error(Object sender, EventArgs ea)  {      if (Server ! null)      {          Exception e;          for (e  Server.GetLastError(); e ! null; e  e.InnerException)          {              _logger.Error(Unhandled server exception thrown., e);          }      }  }     2.3 处理关键方法 下面我还在关键方法记录了用户的操作异常信息、响应速度。比如我必须记录了1用户注册时响应速度、注册时发生的异常、用户登录时响应速度、用户登录时发生的异常2用户在什么情况下尝试下载iOpenWorksSDK这个免费插件框架3尝试下载时会转到注册页面这时候用户是否继续注册并下载还是放弃。 对这些关键方法的记录有助于提高应用系统的易用性。通过日志我们修复了与Discuz集成的很多问题并且提高了用户响应速度。   2.4 日志分析 下面我们需要来看一下日志分析这里我们在一个开源的LogViewer自定义了一下。通过对日志的分析你就可以知道系统发生了什么异常、系统性能如何、用户操作习惯、关键方法的信息。当然你也可以打开日志文件直接查看只是那样比较费劲。对了在这里我们绝不记录用户的密码这太不职业道德了此外所有密码都是加密的避免“CSDN” 1查看异常信息 2查看关键方法信息用户访问习惯、响应性能等   3 解决DiscuzToolkit线程同步 网站的社区是与Discuz集成的我们就用了DiscuzToolkit来集成。这是官方发布的类库但是依然问题一堆。最严重的2个问题就是线程同步引起的可见Discuz这帮人对ASP.NET多线程模型压根没有当一回事或者连线程安全都没有注意到。下面就说一下碰到的2个线程安全问题。 1在注册用户时碰到以下异常当前会话所提交的call_id没有大于前一次的call_id Failed to get the user name though the user is logged in. Discuz.Toolkit.DiscuzException: Code: 103, Message: 当前会话所提交的call_id没有大于前一次的call_id at Discuz.Toolkit.Util.GetResponse[T](String method_name, DiscuzParam[] parameters) in E:\Work\Design\Core\milestore 1\osgi\m10\uishell.iopenworks\DiscuzToolkit\Util.cs:line 97 at Discuz.Toolkit.DiscuzSession.GetUserInfo(Int64[] uids, String[] fields) in E:\Work\Design\Core\milestore 1\osgi\m10\uishell.iopenworks\DiscuzToolkit\DiscuzSession.cs:line 224 at Discuz.Toolkit.DiscuzSession.GetUserInfo(Int64 uid) in E:\Work\Design\Core\milestore 1\osgi\m10\uishell.iopenworks\DiscuzToolkit\DiscuzSession.cs:line 255 这个问题是由Discuz.Toolkit.Util的Sign方法引起的在这里它为每一个API请求生成一个call_id。   list.Add(DiscuzParam.Create(call_id, DateTime.Now.Ticks));     如果你在当前线程API调用太勤快的话DateTime.Now.Ticks会生成一样的值从而引发异常。因此官方提议可以Sleep一下。因此我们就需要改成如下   list.Add(DiscuzParam.Create(call_id, DateTime.Now.Ticks)); // Avoid to generate same call_id and throws an exception on 当前会话所提交的call_id没有大于前一次的call_id. Thread.Sleep(50);     但是这样依然是不行的这个异常只是变得更加诡异了让你碰到机会少一点而已。你别忘了ASP.NET应用程序是多线程的当两个线程同时访问时依然可能获得同一个call_id于是在碰到若干次这个问题后我用以下方法来修复。   lock (_syncRoot)  {      list.Add(DiscuzParam.Create(call_id, DateTime.Now.Ticks));      // Avoid to generate same call_id and throws an exception on 当前会话所提交的call_id没有大于前一次的call_id.     Thread.Sleep(50);  }     2注册用户时碰到以下异常An item with the same key has already been added. [2012-04-07 17:11:30,818] [7] [ERROR] [AccountController] [49.72.46.135] []: System.ArgumentException: An item with the same key has already been added. at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at System.Collections.Generic.Dictionary2.Add(TKey key, TValue value) at Discuz.Toolkit.Util.GetSerializer(Type t) in E:\Work\Design\Core\milestore 1\osgi\m10\uishell.iopenworks\DiscuzToolkit\Util.cs:line 157 at Discuz.Toolkit.Util.GetResponse[T](String method_name, DiscuzParam[] parameters) in E:\Work\Design\Core\milestore 1\osgi\m10\uishell.iopenworks\DiscuzToolkit\Util.cs:line 88 at Discuz.Toolkit.DiscuzSession.GetUserID(String username) in E:\Work\Design\Core\milestore 1\osgi\m10\uishell.iopenworks\DiscuzToolkit\DiscuzSession.cs:line 243 at UIShell.iOpenWorks.Controllers.AccountController.Register(DiscuzNewUser newUser, String returnUrl) in E:\Work\Design\Core\milestore 1\osgi\m10\uishell.iopenworks\UIShell.iOpenWorks\Controllers\AccountController.cs:line 53   你想想要是用户注册时动不动碰到注册不成功是多么窝火所以我根据日志再次调查发现DiscuzToolkit在使用静态变量保存数据时竟然不加锁太不拿Thread-Safe当回事了。这会异常也发生在Util类里代码如下其中serializer_dict是静态全局变量。   serializer_dict.Add(type_hash, new XmlSerializer(t));   于是我修改如下。这样彻底解决了和Discuz的集成了。   private static Dictionaryint, XmlSerializer serializer_dict  new Dictionaryint, XmlSerializer(); private static ReaderWriterLock _lock  new ReaderWriterLock(); public static XmlSerializer GetSerializer(Type t)  {      int type_hash  t.GetHashCode();      const int timeout  5000;     try      {          _lock.AcquireReaderLock(timeout);          if (!serializer_dict.ContainsKey(type_hash))          {              _lock.UpgradeToWriterLock(timeout);              if (!serializer_dict.ContainsKey(type_hash))              {                  serializer_dict.Add(type_hash, new XmlSerializer(t));              }          }         return serializer_dict[type_hash];      }      catch (ApplicationException ex)      {          throw new Exception(Accquire lock failed., ex);      }      finally      {          if (_lock.IsReaderLockHeld)          {              _lock.ReleaseReaderLock();          }          else if (_lock.IsWriterLockHeld)          {              _lock.ReleaseWriterLock();          }      }  }     OK关于网站试运行中最重要的几点分享描述完了。顺道介绍一下什么是iOpenWorks.com。iOpenWorks.com是一个免费开放的插件仓库旨在向开发人员提供完全免费的标准化的OSGi.NET面向服务插件框架以及共享的插件仓库这样你既可以从插件仓库使用别人插件也可以共享自己的插件互利共赢   你也可以加入iOpenWorks交流群121369588Thanks。 本文转自道法自然博客园博客原文链接http://www.cnblogs.com/baihmpgy/archive/2012/04/09/2438720.html如需转载请自行联系原作者
http://www.yutouwan.com/news/218435/

相关文章:

  • 和平东路网站建设建设工程+质量+协会网站
  • h5建站工具网页制作教程视频简单
  • 2017网站建设报价单免费做网站推荐
  • 徐州网站建设培训千图网素材下载网站
  • 天天爱天天做视频网站做网站 什么主题较好
  • 建设网站火车票预订做网站 商标分类
  • 网站开发关于安全问题app制作手机版
  • 网站的在线支付模块怎么做电商网站建设代理商
  • 浙江网站建设电话wordpress admin-ajax.php远程sql注入漏洞
  • 封面制作网站建立自己的网站软件有
  • 网站建设是不是可以免费建站做外贸应该去什么网站
  • 固始网站建设公司阿里云网站方案建设书
  • 网站开发环境怎么写做网站用到什么开发语言
  • 网站建设收费标准方案姓氏头像在线制作免费生成图片
  • 哪些属于功能型网站网站建设案例教程试卷
  • 佛山建设外贸网站公司吗设计网站专业
  • 有什么做ppt参考的网站深汕特别合作区房价
  • 好听大气的公司名字绍兴网站建设优化
  • 深圳做网站公司多少钱微信里的小程序怎么删了
  • 网站开发入门书彩票网站开发 极云
  • 高校思政教育工作网站建设中山手机网站建设费用
  • 医疗 企业 网站制作投资手机网站源码
  • 如何做拼多多商城官网站网页制作素材照片和文案
  • 网站攻击一般有那些如何做百度搜索推广
  • 推广及建设网站长春品牌网站建设公司
  • xd软件可做网站吗丽水市莲都建设分局网站
  • wordpress图片网站wordpress musicpro
  • 服务器维护费用明细增城网站怎么做seo
  • 零食天堂专做零食推荐的网站亚马逊aws wordpress
  • 仿糗事百科网站源码dede二次开发分享+评论+互动冬夜主题wordpress