您的位置:首页 > 编程语言 > ASP

ExtJS 中使用Asp.net编写后台服务器程序的几种方式

2012-08-07 14:40 330 查看
现在大多数使用Extjs的程序都使用Java来编写后台服务器程序,下面简单介绍一下如何使用Asp.net来编写后台服务器程序.

使用Asp.net编写Extjs的后台服务器程序大概有下面几种方式:

1.使用 .net Framework 3.5中的WCF来实现,因为.net 3.5 中的WCF 中新增加了一个Attributes来支持这种方式,但是具体没有使用过,有兴趣的朋友可以关注一下.

2.在Asp.net中定义一个.aspx页面,然后在aspx.cs中文件中添加一个方法来相应Extjs的web 请求,具体方式如下:

2.1:

public partial class _Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

ExtJsRequest();

}

}

public string ExtJsRequest()

{

string sRtn = string.Empty;

string sReq = Request["req"].ToString();

sRtn = "{'success':true,'Message':" + sReq + "}";

return sRtn;

}

}

这种方法使用起来比较简单,但是会在Server 端生成很多不需要的aspx页面,基本上每定义一个方法就需要在服务端定义一个页面,不利于代码的维护.

3:借鉴Java 中的Servlet原理,将Extjs的请求分流到Server端具体的类中去,避免了不需要的aspx页面的生成,具体的实现如下:

3.1:在Server端实现一个继承IHttpHandler接口的类,在其中实现对Extjs请求的分流.

public class Servlet : System.Web.IHttpHandler

{

public DataSet ds;

public Servlet()

{

ds = new DataSet();

string path = HttpContext.Current.Server.MapPath("../Config.xml");

ds.ReadXml(path);

}

public void ProcessRequest(HttpContext ctx)

{

try

{

string name = ctx.Request.Url.AbsolutePath;

name = name.Substring(0, name.IndexOf('.'));

DataRow[] dc = ds.Tables[0].Select("url ='" + name + "'");

if (dc.Length > 0)

{

Type ht = Type.GetType(dc[0]["Class"].ToString());

object obj = Activator.CreateInstance(ht);

MethodInfo mi = ht.GetMethod(dc[0]["function"].ToString());

object objRtn = mi.Invoke(obj, new object[] { ctx.Request });

ctx.Response.Write(objRtn as string);

}

}

catch (Exception ex)

{

throw ex;

}

}

public bool IsReusable

{

get

{

return true;

}

}

}

代码中标记为黄色的部分是一个自定义的配置文件格式.

3.2 :自定义配置文件

<?xml version="1.0" encoding="utf-8" ?>

<ConfigNode>

<Mapping url="/YouProject/User/List" Class="WebUI.Bll.User" Function="List"></Mapping>

</ConfigNode>

配置文件中相关属性介绍:

URL:请求ExtJs的请求地址;

Class:该请求分流到的Server端具体的类;

Function:Server具体类中的对应Extjs请求的方法;

标记为红色的代码是使用反射来定位到Server端具体类的具体方法;

3.3:定义相关实体类

WebUI.Bll.User 定义如下:

namespace WebUI.Bll

{

public class User

{

public string List(HttpRequest request)

{

...具体逻辑

}

}

}

需要注意的是:

1.WebUI.Bll.User 的方法必须定义为public;

2.List 方法必须带一个HttpRequest的参数,因为要获取相应的Extjs的请求参数;

3.4:在WebConfig 进行配置

<httpHandlers>

<remove verb="*" path="*.asmx"/>

<add verb="*" path="/YouProject/login.aspx"
type="System.Web.UI.PageHandlerFactory"/> ---不拦截

<add verb="*" path="*.aspx" type="Servlet"/>
---使用自定义的Httphander 来进行处理

<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>

<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>

<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>

</httpHandlers>

因为Asp.net会对.aspx页面使用默认的HttpHandler来进行拦截:System.Web.UI.PageHandlerFactory,所以如果在你的程序中你有的页面不想拦截比如:login.aspx,logout.aspx,Index.aspx ,那你可以在<httpHandler>配置节中进行配置。

通过第3种方法,在Server 端可以很好的组织代码,并且无需增加不必要的.aspx页面,可以将实体类定义到 Bussiness Layer 中,符合三层架构.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: