ExtJS 中使用Asp.net编写后台服务器程序的几种方式 [转载]
现在大多数使用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 中,符合三层架构.
Tag标签: [url=http://www.cnblogs.com/Guzenyin/tag/ExtJS+%e4%b8%ad%e4%bd%bf%e7%94%a8Asp.net%e7%bc%96%e5%86%99%e5%90%8e%e5%8f%b0%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%a8%8b%e5%ba%8f%e7%9a%84%e5%87%a0%e7%a7%8d%e6%96%b9%e5%bc%8f/][u][color=#0066cc]ExtJS 中使用Asp.net编写后台服务器程序的几种方式[/color][/u][/url]
posted @ 2008-11-08 14:34 [url=http://www.cnblogs.com/Guzenyin/][u][color=#0066cc]ItinYin[/color][/u][/url] 阅读(1182) [url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#Post][u][color=#0066cc]评论(5)[/color][/u][/url] [url=http://www.cnblogs.com/Guzenyin/admin/EditPosts.aspx?postid=1329610][u][color=#0066cc]编辑[/color][/u][/url] [url=http://www.cnblogs.com/Guzenyin/AddToFavorite.aspx?id=1329610][u][color=#0066cc]收藏[/color][/u][/url] [url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#][u][color=#0066cc]网摘[/color][/u][/url]
[img=1,1]http://www.cnblogs.com/Guzenyin/aggbug/1329610.html?type=1&webview=1[/img]
发表评论
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]回复[/color][/u][/url] [url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]引用[/color][/u][/url] [url=http://www.cnblogs.com/CommentsByAuthor.aspx?author=%e8%a1%a5%e4%b8%81][u][color=#0066cc]查看[/color][/u][/url]
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#1364692][u][color=#0066cc]#1楼[/color][/u][/url] 2008-11-08 14:44 | [url=http://www.cnblogs.com/Corrox/][u][color=#0066cc]补丁[/color][/u][/url] [url=http://space.cnblogs.com/msg/send/%e8%a1%a5%e4%b8%81][u][color=#0066cc] [/color][/u][/url]
直接用webservice返回json就好了
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]回复[/color][/u][/url] [url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]引用[/color][/u][/url] [url=http://www.cnblogs.com/CommentsByAuthor.aspx?author=Gray+Zhang][u][color=#0066cc]查看[/color][/u][/url]
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#1364783][u][color=#0066cc]#2楼[/color][/u][/url] 2008-11-08 17:38 | [url=http://www.cnblogs.com/GrayZhang/][u][color=#0066cc]Gray Zhang[/color][/u][/url] [url=http://space.cnblogs.com/msg/send/Gray+Zhang][u][color=#0066cc] [/color][/u][/url]
@补丁
asp.net webservice会给返回的对象加上一个包装“d”,假如原来你返回:
{success: true, msg: 'xxx'}
最后会变成:
{d: {success: true, msg: 'xxx'}}
这个在ext的默认解析中肯定通不过,需要修改相关的Reader实现,也很麻烦
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]回复[/color][/u][/url] [url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]引用[/color][/u][/url] [url=http://www.cnblogs.com/CommentsByAuthor.aspx?author=aspnetx][u][color=#0066cc]查看[/color][/u][/url]
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#1364824][u][color=#0066cc]#3楼[/color][/u][/url] 2008-11-08 19:05 | [url=http://www.cnblogs.com/aspnetx/][u][color=#0066cc]aspnetx[/color][/u][/url] [url=http://space.cnblogs.com/msg/send/aspnetx][u][color=#0066cc] [/color][/u][/url]
个人倾向IHttpHandler的方式
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]回复[/color][/u][/url] [url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]引用[/color][/u][/url] [url=http://www.cnblogs.com/CommentsByAuthor.aspx?author=ItinYin][u][color=#0066cc]查看[/color][/u][/url]
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#1364850][u][color=#0066cc]#4楼[/color][/u][/url] [楼主]2008-11-08 20:19 | [url=http://www.cnblogs.com/Guzenyin/][u][color=#0066cc]ItinYin[/color][/u][/url] [url=http://space.cnblogs.com/msg/send/ItinYin][u][color=#0066cc] [/color][/u][/url]
用Webservice也是一种很好的选择,但是正如2楼所说的Webservices会对生成的Json对象进行重新包装,会给使用带来不方便.
而用IHttpHander的方法可以直接将Ext的请求对应到相应的BLL层中去,全部的代码由程序员控制,可以很好的对代码进行组织,所以我推荐使用这种方法.
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]回复[/color][/u][/url] [url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#post][u][color=#0066cc]引用[/color][/u][/url] [url=http://www.cnblogs.com/CommentsByAuthor.aspx?author=%e5%ad%a4%e7%8b%ac%e4%be%a0%e5%ae%a2][u][color=#0066cc]查看[/color][/u][/url]
[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html#1364852][u][color=#0066cc]#5楼[/color][/u][/url] 2008-11-08 20:19 | [url=http://www.cnblogs.com/lonely7345/][u][color=#0066cc]孤独侠客[/color][/u][/url] [url=http://space.cnblogs.com/msg/send/%e5%ad%a4%e7%8b%ac%e4%be%a0%e5%ae%a2][u][color=#0066cc] [/color][/u][/url]
我们现在就在直接用asp.net mvc和extjs交互.还不错
=============================
尊重作者标明来源地址:[url=http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html]http://www.cnblogs.com/Guzenyin/archive/2008/11/08/1329610.html[/url]
就像最后一楼的回帖一样。我推荐使用 MVC Routing来解决路由问题。当然 作者的方式还是比较有灵活性的。
如果能把httpHandlers 独立到一个 handlers.Config 里面更好:)
页:
[1]

