• 杂乱谈


        坚持与保持热情是一件很难的事,说实话有时候我也会质疑现在去深入学习一些技术有没有用,因为心态有时候会太浮躁,为什么要谈这个呢,因为从去年开始我听到最多的就是这些问题。

    工作

    简单先说说项目都用了哪些技术吧。

    一.ASP.NET MVC

    网站使用ASP.NET MVC 开发效率相对还是蛮快的,比如有如下的特性

    1.使用模型的声明式验证 ,简化了表单验证

    2.Razor视图或单独使用RazorEngine

    3.拦截器 我习惯这样称呼,因为之前springmvc一般这样称呼,比如做一个自动登录的验证[cookies],全局的日志记录等

    4.路由也是蛮重要的一个东西,特别是对有洁癖的开发人员来说,比如你就是喜欢要每一个访问的URL都要简短并且有意义,或SEO实现类似/shanghai的URL等等(开始mvc4试了特性路由 http://attributerouting.net/),ASP.NET MVC 5.1 后已经支持,调试路由的工具 Install-Package routedebugger 等

    5.返回匿名类JSON,局部视图,扩展htmlhelper等等,这个功能非常方便,可以自定义扩展自己的方法

    6.缓存 使用MvcDonutCaching ,功能还比原生的多一些,基本一致,另外缓存服务Redis或Couchbase

    7.js与css的合并压缩,Bundle 确实要方便很多,无需管理js的合并与样式版本号问题

    8.日志 使用了NLog个人感觉要笔log4j好很多,错误与异常级别记录文本,window事件,db,email,基本满足需求,另外Elman也是蛮好用

    9.XSS 使用了AntiXSS,ValidateAntiForgeryToken 另外就是写代码的时候多注意

    10.页面性能,使用 MiniProfiler [http://www.asp.net/mvc/overview/performance/profile-and-debug-your-aspnet-mvc-app-with-glimpse]检查调试页面性能,貌似有时候会与 routedebugger 的样式混乱

    二. WEBAPI

    APP的接口与一些常用的接口之前是使用WCF的Rest,后面感觉比较臃肿,就换成了WEBAPI, 个人非常喜欢这个,相比WCF比较轻量,好扩展,相比ASP.NET MVC我改进了一点东西image

    1.使用Autofac作为IOC容器

    2.使用特性路由定义接口URL

    3.使用markdown书写接口文档

    5.全局拦截器对参数约束验证

    6.自动生成/help参数文档 Install-Package Microsoft.AspNet.WebApi.HelpPage

    7.支持跨越访问 Install-Package Microsoft.AspNet.WebApi.Cors

    8.路由调试 WebApiRouteDebugger 执行过程跟踪 Install-Package Microsoft.AspNet.WebApi.Tracing Update-Package Microsoft.AspNet.WebApi.WebHost

    9.另外推荐个HTTP类库Flurl.Http个人感觉要比.NET 4.5自带的HttpClient要好用,支持Task异步 ;扩展方法 Z.ExtensionMethods类库,包含大多数常用的扩展方法

    例:

            /// <summary>
            /// 测试业务异步回调接口是否正确
             /// </summary>
            /// <param name="notifyUrl">业务服务地址</param>
            /// <returns></returns>
            [HttpPost]
            [Route("notify")]
            public async Task<IHttpActionResult> PostJsonAsync(string notifyUrl)
            {
                if (notifyUrl.IsNullOrEmpty() || !notifyUrl.Contains("http", StringComparison.OrdinalIgnoreCase)) return Ok(new { IsError = true, Msg = "NotifyUrl IS EMPTY", Data = string.Empty });
                //notifyUrl = notifyUrl.UrlDecode(System.Text.Encoding.UTF8);
                var payPal = new PayPalData
                {
                    UserID = "test",
                    Subject = "测试异步回调接口",
                    OutTradeNO = "10086",
                    CreateTime = DateTime.Now,
                    GuidNO = Guid.NewGuid().ToString(),
                    TotalFee = "0.01",
                    Origin = "WEB"
                };
                try
                {
                    var data = await notifyUrl.PostJsonAsync(payPal).ReceiveJson<WebAPIResponse>();
                    logger.Info("PayPalController JsonAsync : " + payPal.SerializeJson(System.Text.Encoding.UTF8));
                    if (data.IsError)
                    {
                        return Ok(new { IsError = true, Msg = data.Msg, Data = data.Data });
                    }
                    return Ok(new { IsError = false, Msg = string.Empty, Data = payPal.SerializeJson(System.Text.Encoding.UTF8) });
                }
                catch (Exception ex)
                {
                    return Ok(new { IsError = true, Msg = "PostJsonAsync Exception : " + ex.Message, Data = payPal.SerializeJson(System.Text.Encoding.UTF8) });
                }
            }

    列:Filter

    /// <summary>
        /// http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api
        /// http://www.asp.net/web-api/overview/error-handling/exception-handling
        /// </summary>
        public class ModelValidFilter : ActionFilterAttribute
        {
            /// <summary>
            /// 模型验证
            /// </summary>
            /// <param name="actionContext"></param>
            /// <param name="cancellationToken"></param>
            /// <returns></returns>
            public override Task OnActionExecutingAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
            {
                if (actionContext.ActionArguments.Values.FirstOrDefault().IsNull())
                {
                    var data = new { IsError = true, Msg = "参数不能为空!", Data = string.Empty };
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, data);
                    return base.OnActionExecutingAsync(actionContext, cancellationToken);
                }
                if (!actionContext.ModelState.IsValid)
                {
                    // 注意 !!!!: http://tmenier.github.io/Flurl/fluent-http/ HttpStatusCode.BadRequest 
                    var data = new { IsError = true, Msg = actionContext.ModelState.Values.FirstOrDefault().Errors.FirstOrDefault().ErrorMessage, Data = actionContext.ModelState.Keys.FirstOrDefault() + " :参数验证有误!!!" };
                    actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, data);
                    return base.OnActionExecutingAsync(actionContext, cancellationToken);
                }
                return base.OnActionExecutingAsync(actionContext, cancellationToken);
            }
        }

    另外推荐一个开源的Markdown编辑器  https://pandao.github.io/editor.md/ ,可以集成到项目中,写写接口文档。

    image

    三.StackExchange Dapper

    推荐StackExchange的两款开源项目 StackExchange.Redis (https://github.com/StackExchange/StackExchange.Redis) 与 Dapper

    使用Dapper,操作数据库的代码相比更简洁 ,同时也支持.NET 4.5 Task异步 ,示例具体git下来看下单元测试 https://github.com/StackExchange/dapper-dot-net ,不过要主要Dapper下的一个与MSSQL执行计划的问题 

    Be careful with varchars in Dapper :http://www.codeproject.com/Articles/594133/BepluscarefulpluswithplusvarcharsplusinplusDapper

    四. Quartz

    使用了Quartznet,寄宿window服务,运行一直很稳定。如果想不想使用服务方式可以试试 Install-Package Hangfire 可以集成MVC或OWIN等。

    活动

    杭JS2014

    去年参加了杭JS2014 ,基本就是分享一些关于nodejs相关的东西,不得不说阿里不仅仅是JAVA帝国还是前端江湖的缔造者。

    杭JS - 2014 JavaScript中国开发者大会: 2014-6-21 ~ 22

    https://cnodejs.org/topic/53473dde502e5602740078bc

    2014 杭JS大会 会议盛况与技术热点现场报道(直播)

    http://segmentfault.com/a/1190000000584556

    杭JS 2014 演讲视频合集

    https://cnodejs.org/topic/53bbc408a3ccaece73467f11

    PyConChina 2014

    PyCon2014 这个票是gitcafe送的,一些主题 linux的线程 协程 回调与上下文切换; py与机器学习很厉害的样子;golang 的nsq消息列队

    shanghai-osc-meeting-2014

    shanghai-osc-meeting   the docker way;go的持续集成

    OSC上海源创会

    http://115.29.174.111/shanghai-osc-meeting/

    搭建服务

    后面我还搭建了基于一个nodejs博客:http://115.29.174.111/ 与基于golang的git服务:http://115.29.174.111:3000/

    现在

    码了这么多字,都是一些零碎的东西,感觉也没啥主题,就是记录一些经历过程。

  • 相关阅读:
    解决WampServer窗口界面乱码问题
    PHP 中空字符串介绍0、null、empty和false之间的关系
    位(bit)、字节(byte)、字
    SQL GROUP BY 和 ORDER BY 区别
    爬虫安装相关软件
    nginx自动切割日志脚本
    tengine日志切割-配置分钟级别日志自动切割
    flutter进行自动编译操作步骤
    03-字符编码-读写模式-课堂笔记
    04-函数-课堂笔记
  • 原文地址:https://www.cnblogs.com/Irving/p/4526322.html
Copyright © 2020-2023  润新知