我在网上看到有人说ashx页面发布后代码都在里面,不怎么安全。于是简单百度了下,看到有人把ashx代码放进共享里达到被编译的效果,其实不用这样,这样如果文件一多,管理会很麻烦。ashx的好处不多说,比aspx效率要高。其实要把代码编译进dll,很简单,用到分部类就行
我们首先看看原来的ashx代码
有一个ashx文件名叫做 CheckLogin.ashx,是用来判断登陆的,它的代码文件相应的就是CheckLogin.ashx.cs
我们先看看下面CheckLogin.ashx.cs中的代码(虽然是单独的.cs文件,但是编译后其实还是在ashx文件中)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.SessionState; namespace WebUI.Handler { /// <summary> /// CheckLogin 的摘要说明 /// </summary> public class CheckLogin : IHttpHandler { private void AddUserOnLine(HttpContext context) { context.Response.ContentType = "text/plain"; } //内部处理程序云云.... public bool IsReusable { get { return false; } } }
用这样的方式写,编译网站后代码全在ashx文件里,记事本一打开全看见了。
于是来个小小改动,看下面
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.SessionState; namespace WebUI.Handler { ////// CheckLogin 的摘要说明 /// public partial class CheckLogin : IHttpHandler { 注意上面用到了partial关键字,而这里的代码全剪切到新建的类里了,这边留空就行 } }
加了 partial ,表示这是分部类。
然后再新建一个同名的类文件,CheckLogin.cs ,其中using全照搬,反正里面结构完全一样,要处理的逻辑写这里就行。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.SessionState; namespace WebUI.Handler { public partial class CheckLogin { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; } //这里也用到了partial关键字,表示这个类是CheckLogin的一部分,然后写你的业务逻辑吧,这边的代码会被编译进dll中。 public bool IsReusable { get { return false; } } } }
代码写新建类文件中,搞定,编译看看,ashx文件中没东西啦!全进dll了。
编译完成之后我们打开CheckLogin.ashx文件看到,里面就一行,大小1KB,完美
<%@WebHandler Language="C#" CodeBehind="CheckLogin.ashx.cs" Class="WebUI.Handler.CheckLogin"%>
//除了这行,其他什么都没了。