协思

协作、思考、感悟、进步

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  39 随笔 :: 4 文章 :: 18 评论 :: 71001 阅读

原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com

      在.NET开发初期,微软提供的WEB开发模型是WebForm,试图消除Web和桌面的隔阂,建立一致的开发体验。但是,理想很丰满,现实很骨感,Web的开发方式和桌面软件是完全不一样的。相比WebForm,后出道的MVC显然切合了Web开发者的需求,代码质量明显提升,性能也优化了不少。

      在做MVC项目时,我个人有一些习惯:

1. 将Request和Response中经常使用的方法封装为扩展方法,比如获取登录UserId的方法:

复制代码
public static AuthMemberInfo GetMember(this HttpRequestBase request)
{
    if (request.IsAuthenticated)
    {
        HttpCookie authCookie = request.Cookies[FormsAuthentication.FormsCookieName];
        FormsAuthenticationTicket Ticket = FormsAuthentication.Decrypt(authCookie.Value);
        return JsonConvert.DeserializeObject<AuthMemberInfo>(Ticket.UserData);
    }
    return null;
}
复制代码

2. 权限验证继承AuthorizeAttribute类,实现自己的验证逻辑:

复制代码
public override void OnAuthorization(AuthorizationContext filterContext)
{
    var user = filterContext.HttpContext.Request.GetMember();

    if (user == null)
    {
        filterContext.Result = new RedirectResult(FormsAuthentication.LoginUrl
            + "?returnUrl=" + filterContext.HttpContext.Server.UrlEncode
            (filterContext.HttpContext.Request.RawUrl));
        return;
    }
}
复制代码

如此一来,在任何需要做权限验证的Controller或者方法上加上这个Attribute即可。

3.  所有的Controller都继承自定义的BaseController,目的是可以在必要时作统一行为,比如在OnException中记录日志。

4.  MVC使用框架的JSON序列化器比较坑爹,特别是日期的处理不是ISO格式,给前端JS带来麻烦。 我们可以在BaseController中Override Json方法处理:

复制代码
protected override JsonResult Json(object data, string contentType, 
    Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonNetResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}
复制代码

JsonNetResult使用了Json.net作序列化器,灵活了不少:

复制代码
public class JsonNetResult : JsonResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        var response = context.HttpContext.Response;

        response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";

        if (ContentEncoding != null)
            response.ContentEncoding = ContentEncoding;

        if (Data == null)
            return;

        var serializedObject = JsonConvert.SerializeObject(Data, Formatting.Indented,
            new StringEnumConverter { CamelCaseText = false });
        response.Write(serializedObject);
    }
}
复制代码

5. Global.asax捕获到全局异常后,统一交给ErrorController处理:

复制代码
var routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "ThrowError");
routeData.Values.Add("message", "很抱歉,服务器发生内部错误。");
Server.ClearError();

//输出业务异常信息
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(this.Context), routeData));
复制代码
posted on   协思  阅读(1261)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示