我们来打造一个简单的专用于json调用的mvc实现,最终会将如下的C#代码暴露给js调用(代码在最后面有下载):

public class UserController
{
public static Json GetUser( [HttpQueryString("x_user")]
int userId, [HttpQueryString("msg")]
string msg)
{
Json json = new Json();
json.IsSuccess = true; json.Data = new {
Field1=userId,
Field2=msg
};
return json;
}
}

上面这些用到的class,如:Json, HttpQueryString之类的都是自己写的,不是asp.net mvc的类。

(HttpQueryString("x_user")代表修饰的变量userId的值是从QueryString集合中获取的,并且key为x_user,怎么样,够容易理解的吧)

配置文件中还要加入相应的HandlerFactory(代表符合ajax/*.ashx的路径都会被MvcHandlerFactory处理,目前只实现了JsonHttpHandler):

<httpHandlers>
<add type="Mvc.Factories.MvcHandlerFactory, Mvc" path="ajax/*.ashx" verb="*"/>
</httpHandlers>

入口找到了,就好办了,我们来看看这个MvcHandlerFactory:

public class MvcHandlerFactory:IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
ControllerDescriptor controllerDescriptor = ControllerFactory.Resolve(context); //解析当前请求的ControllerDescriptor
if (controllerDescriptor == null)
throw new Exception("没有找到相应的Controller"); MethodDescriptor methodDescriptor = MethodFactory.Resolve(controllerDescriptor, context);//解析当前请求的MethodDescriptor
if (methodDescriptor == null)
throw new Exception("没有找到相应的调用方法"); IHttpHandler handler = new JsonHttpHandler(controllerDescriptor, methodDescriptor);//由于目前只做了Json处理器,因此直接硬编码此类
return handler;
} public void ReleaseHandler(IHttpHandler handler)
{
throw new NotImplementedException();
}
}

完成下面这些工作:

  • 根据context请求解析出目标Controller
  • 根据目标Controller以及context请求解析出目标函数Method
  • 在解析Method时,内部还解析了这个Method所涉及到的参数、取值位置(从Request.Form、Request.QueryString, Cookie, Headers等位置,或者Any(Request.Params))、key等

再来看看JsonHttpHandler:

public class JsonHttpHandler:IHttpHandler
{
private ControllerDescriptor controllerDescriptor;
private MethodDescriptor methodDescriptor;
private JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();//用了ms的json序列化器 public JsonHttpHandler(ControllerDescriptor controllerDescriptor, MethodDescriptor methodDescriptor)
{
this.controllerDescriptor = controllerDescriptor;
this.methodDescriptor = methodDescriptor;
} public bool IsReusable//无所谓里面的返回值,ms用不到这个value,都是false
{
get { throw new NotImplementedException(); }
} public void ProcessRequest(HttpContext context)
{
MethodInfo mi = this.controllerDescriptor.ControllerType.GetMethod(this.methodDescriptor.MethodName); List<object> parameters = new List<object>(); foreach (var pd in this.methodDescriptor.ParameterDescriptors)
{
object value = ParameterParser.GetValue(context, pd);//遍历all参数,并且从相应的location取值
parameters.Add(value);
} object result=mi.Invoke(null, parameters.ToArray());//调用具体Controller中的函数,由于是静态函数,因此传入了null作为instance
string json=jsonSerializer.Serialize(result);//序列化为json字符串
context.Response.Write(json);
}
}

还需要在global中增加搜索所有Controller后缀的class到注册Dictionary中,这里就是些遍历,大家可以看代码,代码就不贴了

目前这个框架是简陋的,不过也看到了有很多能插入的点,比如[RequestLimit(HttpRequestType.Post)]等,大家懂的。

一旦自己能深入到框架内部,许多难题就不再是难题了,可以很快解决。

附上vs2012写的代码(家里电脑只有vs2012,没有vs2010...)

极简MVC的实现的更多相关文章

  1. 通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]

    <200行代码,7个对象--让你了解ASP.NET Core框架的本质>让很多读者对ASP.NET Core管道有了真实的了解.在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分 ...

  2. .NET开源项目 QuarkDoc 一款自带极简主义属性的文档管理系统

    有些话说在前头 因为公司产品业务重构且功能拆分组件化,往后会有很多的接口文档需要留存,所以急需一款文档管理系统.当时选型要求3点: 1.不能是云平台上的Saas服务,整个系统都要在自己公司部署维护(数 ...

  3. CSharpGL(28)得到高精度可定制字形贴图的极简方法

    CSharpGL(28)得到高精度可定制字形贴图的极简方法 回顾 以前我用SharpFont实现了解析TTF文件从而获取字形贴图的功能,并最终实现了用OpenGL渲染文字. 使用SharpFont,美 ...

  4. Vim,极简使用教程,让你瞬间脱离键鼠切换的痛苦

    注:看大家对Vim仇恨极大,其实它只是一种文本操作方式,可以减少键鼠的切换,从而让编辑文本的操作更迅捷.并不等同于IDE,在我看来,它们是两个是包含关系,IDE可以有Vim编辑模式.Vim或许可以通过 ...

  5. CentOS下使用Postfix + Dovecot + Dnsmasq搭建极简局域网邮件系统

    背景 开发环境为局域网,工作内容需要经常查看邮件文件(*.eml),可恶的Foxmail必须验证账户才能进入主界面,才能打开eml文件查看. 无奈搭一个局域网内的邮件系统吧.极简搭建,仅用于通过Fox ...

  6. 在Web应用中接入微信支付的流程之极简清晰版

    在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...

  7. Snabbt.js – 极简的 JavaScript 动画库

    Snabbt.js 是一个简约的 JavaScript 动画库.它会平移,旋转,缩放,倾斜和调整你的元素.通过矩阵乘法运算,变换等可以任何你想要的方式进行组合.最终的结果通过 CSS3 变换矩阵设置. ...

  8. 在Web应用中接入微信支付的流程之极简清晰版 (转)

    在Web应用中接入微信支付的流程之极简清晰版 背景: 在Web应用中接入微信支付,我以为只是调用几个API稍作调试即可. 没想到微信的API和官方文档里隐坑无数,致我抱着怀疑人生的心情悲愤踩遍了丫们布 ...

  9. 基于 Node.js 平台,快速、开放、极简的 web 开发框架。

    资料地址:http://www.expressjs.com.cn/ Express 基于 Node.js 平台,快速.开放.极简的 web 开发框架. $ npm install express -- ...

随机推荐

  1. [vb.net]最简单的邮件发送

    Imports Microsoft.Office.Interop.Outlook Private Sub sendMail() Dim outObj As New Application Dim it ...

  2. 【排列组合】bzoj3505 [Cqoi2014]数三角形

    http://blog.csdn.net/zhb1997/article/details/38474795 #include<cstdio> #include<algorithm&g ...

  3. bcb安装控件方法汇总

    1.BCB 菜单: Project->Options->Packages->Add[喝小酒的网摘]http://blog.const.net.cn/a/8496.htm如果是BCB6 ...

  4. VM - Bridge Adapter

    如何让外部可以连到本地的虚拟机. 1. 网络模式 - Bridged Adapter 2. 确保本机插上网线 3. 如果虚拟机是 Windows 8.1, 需要开启如下选项.

  5. Web大文件下载控件更新-Xproer.HttpDownloader

    资源下载:cab安装包(x86),cab安装包(x64),xpi安装包,crx安装包,nat安装包,exe安装包,开发文档,根证书,VC库,   更新时间:2016-08-19 版本号:1,2,56, ...

  6. 【笔记】DOM探索基础篇(二)

    # 浏览器的渲染(HTML解析) ——参考: <前端必读:浏览器内部工作原理>http://kb.cnblogs.com/page/129756/ <谈谈DOMContentLoad ...

  7. Android之Inflate()方法用途

    转自:http://blog.csdn.net/andypan1314/article/details/6715928 Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的 ...

  8. 标签控制器  UITabBarController

    UITabBarController和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换.   #import ...

  9. 从0开始学Swift笔记整理(一)

    Swift 是一种适用于 iOS 和 OS X 应用的全新编程语言,它建立在最好的 C 和 Objective-C 语言之上,并且没有 C 语言的兼容性限制.Swift 采用安全的编程模式,增加了现代 ...

  10. python脚本实现集群检测和管理

    python脚本实现集群检测和管理 场景是这样的:一个生产机房,会有很多的测试机器和生产机器(也就是30台左右吧),由于管理较为混乱导致了哪台机器有人用.哪台机器没人用都不清楚,从而产生了一个想法-- ...