RSS 2.0 Feed
2006-04 Entries
摘要:先看下面两个Url,他们传递的参数一样么??aaa.aspx?tag=.net%bc%bc%ca%f5aaa.aspx?tag=.net%e6%8a%80%e6%9c%af 看起来好像是不一样,其实他们都是对".net技术"进行了UrlEncode,不过一个是GB2312的编码,一个是Utf-8的编码。如下代码就可以获得上面的编码后效果: string tmp1 = System.Web.HttpUtility.UrlEncode(".net技术", System.Text.Encoding.GetEncoding("GB2312"));string tmp2 = System.Web.HttpUtility.UrlEncode(".net技术", System.Text.Encoding.UTF8); 我们实际的Web页面,可能会被其他程序调用。比如:简体中文操作系统上的一个ASP页面,需要向一个ASP.net页面传递一个带中文的参数。默认情况下,简体中文操作系统上, ASP 的 Server.UrlEncode 方法会把中文以GB2312的编码进行编码,但是默认情况下,ASP.net的页面是采用的UTF-8编码。这种情况下,你在用 Request.QueryString["Tag"] 接受值的时候会接受不到中文信息,单步调试看到的是乱码。这时候虽然用Request.QueryString["Tag"] 接受的是乱码,但这时候的Url并不是乱码。 解决方法就是自己分析Url中的参数,然后对参数的值按照 GB2312的编码反解密,而不是用.net 默认的Utf-8的编码反解密。其实微软类似的提供了相应的函数,我们不必自己用正则表达式去分析url字符串了。 演示代码如下: string q = Request.Url.Query; System.Collections.Specialized.NameValueCollection nv =  System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312"));Response.Write(nv["Tag"]); 我们用 Lutz Roeder's .NET Reflector  来看 System.Web.HttpUtility.ParseQueryString 方法的实现:一直反查进去,我们可以看到最终处理Url参数字符串分析的代码如下: System.Web.HttpValueCollection 类的如下函数实现了对Url参数的解析这里我们看到,它是自己一个个字符进行的分析。 internal void FillFromString(string s, bool urlencoded, Encoding encoding){      int num1 = (s != null) ? s.Length : 0;      for (int num2 = 0; num2 < num1; num2++)      {            int num3 = num2;            int num4 = -1;            while (num2 < num1)            {                  switch (s[num2])                  {                        case '=':                              if (num4 < 0)                              {                                    num4 = num2;                              }                              break;                  }                  num2++;            }            string text1 = null;            string text2 = null;            if......[阅读全文]

posted @ | Feedback (14) | Filed Under [ .net 编程心得 技术随笔 网站开发管理相关内容 ]

摘要:国外有种习惯,比如你访问 www.****.com 网站,他会自动跳转到 ****.com 。在 Community Server 中就提供了这种功能,而且这种功能是可选的(可以强制去掉、强制不去掉、不理睬它)。默认情况下 Community Server 就强制去掉 www. 。 先说如何修改是这个功能 打开Web项目,其中的 communityserver.config 配置文件。在这里我们可以看到下面的配置节: <CommunityServer><Core ......  wwwStatus = "Remove" .... />......</CommunityServer> 这里可以有三个设置:Require   强制加 www.Remove  强制不加 www.  这个是默认设置 Ignore     忽略这个问题 只要修改成对应的设置,就自动切换了这个设置。 下面我们看它是如何实现这个功能的: Community Server 2.0 中使用了 HttpModules 来处理这个功能:web.config中,我们可以看到 httpModules 的配置如下:     <httpModules>      <add name="CommunityServer" type="CommunityServer.CSHttpModule, CommunityServer.Components" />    </httpModules>.......... CSHttpModule 类在 CommunityServer.Components 项目的HttpModule 目录下的 CSHttpModule.cs 文件中.这个类继承了 System.Web.IHttpModule 接口 System.Web.IHttpModule 接口要求实现 初始化模块方法,即 Init 方法。在这个类的初始化方法中,我们可以看到,我们订约了BeginRequest 事件。 public void Init(HttpApplication application) {  application.BeginRequest += new EventHandler(this.Application_BeginRequest); ......} 在这个事件的处理函数 Application_BeginRequest 中,如下,我们可以看到,先从Community Server 配置文件中读取出配置(既从communityserver.config 配置文件读取配置)然后根据这个配置检查我该如何处理(CheckWWWStatus 函数实现)。 private void Application_BeginRequest(Object source, EventArgs e) { ....... HttpContext context = application.Context; ....... CSConfiguration config = CSConfiguration.GetConfig(); ....... CheckWWWStatus(config,context); .......} private void CheckWWWStatus(CSConfiguration config, HttpContext context){ if(config.WWWStatus == WWWStatus.Ignore)  return; const string withWWW = "http://www."; const string noWWW = "http://"; string rawUrl = context.Request.Url.ToString().ToLower(); bool isWWW = rawUrl.StartsWith(withWWW); if(config.WWWStatus......[阅读全文]

posted @ | Feedback (7) | Filed Under [ .net 编程心得 技术随笔 网站开发管理相关内容 VS2005相关 ]

摘要:网上有很多写这个组件使用的文章,如何使用我就不细述了,有关在 ASP.NET 中执行 URL 重写的文章请看下面链接:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx?mfr=true 我这里要说的是其中几个很容易被忽视的小细节。问题场景:比如实际我并不存在下面三个WEB路径: http://*******/Tag/Javahttp://*******/Tag/Java/http://*******/Tag/Java/Default.aspx 我想把它重定向到http://*******/List.aspx?tag=Java 这时候如果我们偷懒,直接用Scott Mitchell 的 URLRewriter 组件,需要注意的有几个地方: 1、我们需要给IIS设置通配符映射,而且这个映射必须不进行文件是否存在检查。 2、我们在WEB.config 中应该用 httpModules 来定义扑捉用户的请求,而不是 httpHandlers。因为我们这里要处理 http://*******/Tag/Java 、 http://*******/Tag/Java/ 这样的请求。 3、设置这个信息的 Web.config 应该是根站点目录下的 Web.config,而不是 /Tag/ 目录下的Web.config。 4、要扑捉的URL应该这三种情况都计算,而不是只考虑 http://*******/Tag/Java/Default.aspx 这种情况。参考配置如下:   <RewriterConfig>    <Rules>      <RewriterRule>        <LookFor>~/tag/([\w]+)/default\.aspx</LookFor>        <SendTo>~/List.aspx?Tag=$1</SendTo>      </RewriterRule>    </Rules>    <Rules>      <RewriterRule>        <LookFor>~/tag/([\w]+)/</LookFor>        <SendTo>~/List.aspx?Tag=$1</SendTo>      </RewriterRule>    </Rules>    <Rules>      <RewriterRule>        <LookFor>~/tag/([\w]+)</LookFor>        <SendTo>~/List.aspx?Tag=$1</SendTo>      </RewriterRule>    </Rules>  </RewriterConfig>...[阅读全文]

posted @ | Feedback (11) | Filed Under [ .net 编程心得 网站开发管理相关内容 ]

摘要:上篇Blog我介绍了Visual Studio 2005 Web Application Projects  项目,下面来比较一下它跟 Visual Studio 2005 Web Site Projects 使用的场景和区别。内容翻译自:http://msdn.microsoft.com/vstudio/default.aspx?pull=/library/en-us/dnvs05/html/WAP.asp如果你英文够好,可以直接看哪里。你该选择哪种WEB编程模型 Option or Task Web Application Projects Web Site Projects 你有一个大型的Visual Studio .NET 2003 Web应用需要迁移到VS2005。 X   喜欢使用 single-page code 模型来开发网站页面。而不是使用code-behind 模型来编写网站页面   X 喜欢采用下面的方式编写网站:在编写页面时候,为了可以快速的看到编写效果,动态编译该页面,马上可以看到效果,不用编译整个站点。(就是说,只需要保存文件,然后在浏览器中刷新一下,就可以看到自己刚刚做的效果)   X 需要控制编译后应用程序集的名字 X   需要每个页面产生一个应用程序集   X WEB页面或者WEB用户控件中需要使用到单独的类。 X   需要使用多个Project来构建一个Web应用。 X   需要处理pre-build 和 post-build 事件(编译前后需要有自己额外的处理) X   希望把一个目录当作一个WEB应用来处理,而不需要新建一个Project 文件。   X这两种WEB编程模型的不同点: Scenario Web Application Project Web Site Project Project definition 跟 Visual Studio .NET 2003 类似,由于项目文件的存在,只有被项目文件所引用的文件才会在Solution Explorer中出现。而且只有这些文件才会被编译。可以很容易的把一个ASP.NET应用拆分成多个Visual Studio项目。可以很容易的从项目中和源代码管理中排除一个文件。 一个目录结构就是一个WEB项目。没有项目文件存在。这个目录下的所有文件,都被作为项目的一部分而存在。 我们实际部署的一个网站,部署上当然不会有任何项目文件存在,如果你想对这个网站进行修改,用这种编程模型就非常适合。我们根本不用在乎这个WEB站点中,那些文件属于哪个项目。 编译和生成 跟Visual Studio .NET 2003的Web应用项目编译模式几乎一样。 项目中的所有的code-behind 类文件和独立类文件都被编译成一个独立应用程序集。这个应用程序集被放在Bin目录下。因为是一个独立的应用程序集,你能够指定应用程序集的名字、版本、输出位置等信息。 例如:Model-View-Controller (MVC) 模式就可以在这里很好的被使用。因为它允许在WEB页面和WEB用户控件中引用一个独立的类。 编译(Build)命令仅仅是测试这个WEB站点是否编译正确,调试一个WEB站点项目的时候,是通过依赖你的源代码文件,ASP.net进行动态编译页面和类来实现的。 预编译站点和动态编译站点用的是同一个 compilation semantics ,你可以通过预编译来提高站点的性能。ASP.net 动态编译系统提供了两种模型:默认的batch  编译模型和fixed-names 编译模型。batch  编译模型中,被编译成多个应用程序集(典型的是每一个目录被编译成一个)。这时候你看应用程序集,很难对应上是哪个目录。fixed-names 编译模型中,网站的每个页面或者每个用户控件被编译成一个应用程序集。 Iterative development 调试或者运行Web页面的时候,你必须全部编译整个WEB项目。编译整个WEB项目通常比较快,因为Visual Studio使用了增量编译模式,仅仅只有文件被修改后,这部分才会被增量编译进去。 你可以配置Visual Studio 2005的编译属性:编译整个站点、编译一个指定页面、或者什么都不作。在最后一种情况下,当你运行一个WEB站点的时候,Visual Studio 仅打开一个浏览器,并访问当前或者起始页,当这个请求被发送后,ASP.net 才开始动态编译。 这种模式下,页面被动态编译或者被编译成不同应用程序集,所以如果你调试或者运行一个页面的时候,不需要整个项目被编译通过。有错误的部分跟你使用的部分可以互不干扰。默认情况下,当你运行或调试任何WEB页的时候,Visual Studio完全编译Web Site项目。这么做可以看到编译时的所有错误。但是,在开发进程中,完全编译整个站点会是相当慢的。所以推荐你在开发调试中,只编译当前页。 部署 因为所有的类文件被编译成一个应用程序集,当你部署的时候,只需要把这个应用程序集和 .aspx文件、.ascx文件以及其它静态内容文件一起部署。 这种模型下,.aspx 文件将不被编译,当浏览器访问这个页面的时候,才会被动态编译。不过,如果你使用Web Deployment Projects (一个Visual Studio 2005的插件,没有被默认包含到VS2005中),你就可以把 .aspx 文件也编译进入一个应用程序集中。 如果你只修改了小小的一行代码,你也需要把整个项目的所有代码都编译,并且发布包含所有代码的这个应用程序集。 使用Visual Studio 的 Publish Website 命令,你可以把.aspx 文件 和 code-behind 文件编译成应用程序集,所以你看到的编译后的 .aspx 文件头发生了变化。(注意:Build 命令并不会给你可部署的应用程序集)最新版本的 Publish 将支持仅编译 code-behind 文件,这样部署的时候,将不改变 .aspx 文件。 默认是在Bin目录下预编译成几个应用程序集,典型的是一个目录对应一个应用程序集。fixed-names 部署选项可以让每一个WEB页面或者每个WEB用户控件创建一个应用程序集,这样每个页面都有一个可部署的应用程序集。但是,fixed-names 部署选项会增多应用程序集的个数,而且实际内存使用也会增大。 从Visual Studio .NET 2003升级 因为跟VS2003采用了一样的WEB项目开发模型,升级是非常非常简单的。 Web site......[阅读全文]

posted @ | Feedback (23) | Filed Under [ .net 编程心得 技术随笔 网站开发管理相关内容 VS2005相关 ]

摘要:Visual Studio 2005 Web Application Projects 项目Cool的地方 Visual Studio 2005 Web Application Projects 使用了跟 Visual Studio 2003 同样的Web编程模型,同时根据Visual Studio 2005 的一些新特性,又有所发展。 微软的官方站点请看:http://msdn.microsoft.com/asp.net/reference/infrastructure/wap/default.aspx 一些以前VS2003 WEB模型就已经提供的功能:1、Web项目有一个单独的项目文件(******.csproj),这个文件中,定义了WEB项目有哪些文件被包含进去; 下面举一个我们开发网站时候最长碰到的一个场景,来说明这么做的好处。 我们开发的站点,可能会存在一些开发时候没用的目录或者文件,但是实际运作的时候有用的目录或者文件。或者说开发跟实际运行完全无法同步的目录或者文件。比如我们使用了生成静态页面机制,保存静态文件的目录和文件。又比如我们支持网友上传文件,保存这些文件的目录和文件。 为了Debug方便,我们开发电脑上,可能有少量这样的文件。我们部署项目的时候,可不想把这些文件部署上去。由于VS2005的Web文件是把一个目录当成一个项目,所以我们一个目录下,有些目录或者文件不想被包含的时候,就会很苦恼。而这种VS2003下就已经实现的开发模版,就可以很好的解决这个问题。 2、一个WEB项目中,所有的代码文件被编译成一个可选名字的Dll,并且被放到Bin目录下。 现在的VS2005 Web项目,一个代码文件编译成一个Dll。AppCode目录下的代码文件都被编译成AppCode.dll 文件。这么做最大的麻烦是,我们在一个站点下不使用虚拟目录,部署多个Web项目的时候。DLL 很可能文件名重复。比如AppCode.dll的重名,我们通用页面Top、Buttom代码的重名。而且,如果我们只是对代码作了一个很小的修改,如果这个代码是比较底层的公共代码,你完了,几乎所有的Dll都要上传一边。(代码之间的约束关系)。而且有时候,有些你看起来约束关系没有的代码,你不传,也不行。分开编译的好处一点都没感觉到,还不如不分开呢。 3、这个新的编译使用的是标准的MSBuild,这样你就可以处理编译前、编译后这些事件,作些额外的处理。比如初始化Debug环境等。以前如果写过复杂点的应用的人可能都用过这种事件。比如你编写的代码涉及到企业服务。为了调试方便,你可以在主程序编译后事件中,把当前编译后的企业服务组建部署到COM+中,这样就可以简单的按F5就可以调试了。而不需要每次都手工部署Com+后才能调试。 由于Visual Studio 2005 Web Application Projects 项目使用了跟VS2003一样的开发模型,所以你如果想把VS2003 Web项目升级到VS2005 的这种Web项目,将非常非常Easy。 但是它是基于VS2005的,所以一些新的特性也在这个编程模型中有很好的体现,大致说来: 1、在这个项目中,你既可以使用 Visual Studio Development Server作为开发站点服务器,也可以使用IIS作为开发站点服务器。 使用  Visual Studio Development Server作为开发站点服务器 服务器的时候,可以自己指定用哪个端口,以及在哪个虚拟目录下。当然是否使用 NTLM 验证也是可选的。 附:NTLM 身份验证NTLM 是 Windows 95、Windows 98 和 Windows NT 4.0(客户端和服务器)支持的身份验证机制。这种身份验证机制是一种质询响应协议,它可以提供比基本和摘要式更严格的身份验证。NTLM 在 Windows 2000 和更高版本中通过安全性支持提供程序接口 (SSPI) 来实现。这种身份验证,在Debug Web程序的时候,很重要。 2、它支持一些VS2005的新特性,比如: App_Data, App_Themes and App_Browsers  目录又比如: master page 等等。 目前安装这个模型,需要安装两个东西:1、Visual Studio 2005 的一个更新,安装这个更新后,可以支持Web project。你能够在这里下载到这个更新:Update to Support Web Application Projects http://go.microsoft.com/fwlink/?LinkId=63636 2、Web application projects 插件,截至今天我们看到的是RC1版下载地址:http://go.microsoft.com/fwlink/?LinkId=57541在http://weblogs.asp.net/scottgu/archive/2006/04/05/442032.aspx 可以看到, We are then working to also add VS 2005 Web Application Support directly into VS 2005 SP1 (but we wanted to......[阅读全文]

posted @ | Feedback (12) | Filed Under [ .net 编程心得 技术随笔 网站开发管理相关内容 VS2005相关 ]

摘要:由于 Community Server 2.0 的Web项目建立成了 Library 的项目.他的调试就是一个麻烦. 附加到进程的调试方式请看下面Blog,适用于 VS2003 和 VS2005:使用这个技术请参看下面Blog: Community Server 2.0中如何调试项目?http://ugoer.cnblogs.com/archive/2006/02/27/339040.html 另外一个方法就是把 Library 项目 变成 Web 项目,在 VS2003 开发环境下,使用这个技术请参看下面Blog:调试MonoRail程序的三种方法 http://wj.cnblogs.com/archive/2005/08/29/225197.html 把lib项目文件转换成web项目文件 http://mixiaobo.cnblogs.com/archive/2006/03/11/347828.html?在VS2003中以ClassLibrary工程的方式管理Web工程. http://hjf1223.cnblogs.com/archive/2006/03/17/352474.html 其实在 VS2003 开发环境下完全可以不变 Library 项目变成Web项目,稍加配置就可以调试.具体操作:在项目的调试属性里, 设为通过url启动,把url设为该项目的网址.同时把上面的"启用asp.net调试"设为true(注意,这个 CommunityServerWeb 项目当然是被部署在IIS了.) 上面两个 VS2003 下的方法,不使用于 VS2005 开发环境. 如果想在VS2005开发环境下使用VS2003的一些WEB开发方法,设置,可以看微软的这个工具:http://msdn.microsoft.com/asp.net/reference/infrastructure/wap/default.aspx 把一个项目从其他项目变成 WAP 项目,你只需要修改对应的 csproj 文件 把其中的 Local 变成 {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} 即可.这里要解决的在 Microsoft Visual Studio 2005 中直接Debug Community Server 2.0 的代码,最核心的一步就是做上面提到的项目类型修改,改好了就没问题了。然后在项目配置中,配置一下启动页,一切都OK了。详细的步骤请参看 http://broncosolutions.ca/COMMUNITY/blogs/andrew_renner/archive/2006/04/05/77.aspx为了避免有些人连不上那里的服务器,我下面Copy过来:Download the source http://communityserver.com/files/40/releases/default.aspx Download the latest release of Web Application Projects http://msdn.microsoft.com/asp.net/reference/infrastructure/wap/default.aspx Download the VS 2005 Update to support Web Application Projects http://www.microsoft.com/downloads/details.aspx?FamilyId=8B05EE00-9554-4733-8725-3CA89DD9BFCA&displaylang=en Install the VS 2005 Update Install the Web Application Projects Load the solution <path>\CS_2.0.60217.2664_SDK\src\Community Server 20.sln Right click on the CommunityServerWeb20 project and click unload project Right click on the same......[阅读全文]

posted @ | Feedback (11) | Filed Under [ .net 编程心得 技术随笔 网站开发管理相关内容 VS2005相关 ]