摘要: 一、前言 通常我们的项目会包含许多对外的接口,这些接口都需要文档化,标准的接口描述文档需要描述接口的地址、参数、返回值、备注等等;像我们以前的做法是写在word/excel,通常是按模块划分,例如一个模块包含n个接口,就形成一个文档,然后再用版本控制管理。这样做的缺点是: 1.不够直观,每次打开文档 阅读全文
posted @ 2017-04-15 11:16 我是攻城狮 阅读(10765) 评论(1) 推荐(3) 编辑
摘要: 前言 nuget 已经不是什么新东西,它是vs的一个扩展工具,可以让我们在项目中添加、删除、更新引用变得更加快捷方便。现在有许多传统公司对dll的管理还是很落后的,有些甚至时通过发送dll文件,这样做的直接缺点就是很繁琐、容易出错。之前就有试过一个dll的版本不对,测试人员更新到线上接口直接就挂了, 阅读全文
posted @ 2017-02-26 20:21 我是攻城狮 阅读(1267) 评论(2) 推荐(2) 编辑
摘要: 一.前言 权限验证在开发中是经常遇到的,通常也是封装好的模块,如果我们是使用者,通常指需要一个标记特性或者配置一下就可以完成,但实际里面还是有许多东西值得我们去探究。有时候我们也会用一些开源的权限验证框架,不过能自己实现一遍就更好,自己开发的东西成就感(逼格)会更高一些。进入主题,本篇主要是介绍接口 阅读全文
posted @ 2016-12-26 10:36 我是攻城狮 阅读(5093) 评论(31) 推荐(29) 编辑
摘要: 前言 参数验证是一个常见的问题,无论是前端还是后台,都需对用户输入进行验证,以此来保证系统数据的正确性。对于web来说,有些人可能理所当然的想在前端验证就行了,但这样是非常错误的做法,前端代码对于用户来说是透明的,稍微有点技术的人就可以绕过这个验证,直接提交数据到后台。无论是前端网页提交的接口,还是 阅读全文
posted @ 2016-12-08 09:21 我是攻城狮 阅读(4602) 评论(3) 推荐(6) 编辑
摘要: 一、前言 现在做项目数据访问基本都会选择一种orm框架,它以面向对象的形式屏蔽底层的数据访问形式,让开发人员更集中在业务处理上,而不是和数据库的交互上,帮助我们提高开发效率;例如一些简单的insert、update,我们不需要写insert into...sql 语句,而是直接new一个实体对象,然 阅读全文
posted @ 2016-10-16 12:09 我是攻城狮 阅读(943) 评论(0) 推荐(0) 编辑
摘要: 一、前言 DependencyResolver是MVC中一个重要的组件,从名字可以看出,它负责依赖对象的解析,可以说它是MVC框架内部使用的一个IOC容器。MVC内部很多对象的创建都是通过它完成的,或许我们平时没有直接用到它,但是如果你在使用unity、autofac,或者在看一些开源项目时,总会看 阅读全文
posted @ 2016-04-05 09:01 我是攻城狮 阅读(4018) 评论(12) 推荐(9) 编辑
摘要: 一、前言 关于表单验证,园子里已经有不少的文章,相信Web开发人员也都基本写过,最近在一个个人项目中刚好用到,在这里与大家分享一下。本来想从用户注册开始写起,但发现东西比较多,涉及到界面、前端验证、前端加密、后台解密、用户密码Hash、权限验证等等,文章写起来可能会很长,所以这里主要介绍的是登录验证 阅读全文
posted @ 2016-03-28 09:10 我是攻城狮 阅读(7071) 评论(11) 推荐(13) 编辑
摘要: 一、前言 对于WebForm开发,请求通常是一个以.aspx结尾的url,对应一个物理文件,从代码的角度来说它其实是一个控件(Page)。而在MVC中,一个请求对应的是一个Controller里的Action。熟悉asp.net的朋友都知道,asp.net请求实际都是交给HttpHandler处理( 阅读全文
posted @ 2016-03-25 09:30 我是攻城狮 阅读(4227) 评论(10) 推荐(10) 编辑
摘要: 一、前言 异常处理是每个系统必不可少的一个重要部分,它可以让我们的程序在发生错误时友好地提示、记录错误信息,更重要的是不破坏正常的数据和影响系统运行。异常处理应该是一个横切点,所谓横切点就是各个部分都会使用到它,无论是分层中的哪一个层,还是具体的哪个业务逻辑模块,所关注的都是一样的。所以,横切关注点 阅读全文
posted @ 2016-03-17 09:45 我是攻城狮 阅读(3760) 评论(5) 推荐(9) 编辑
摘要: 一、前言 之前也阅读过MVC的源码,并了解过各个模块的运行原理和执行过程,但都没有形成文章(所以也忘得特别快),总感觉分析源码是大神的工作,而且很多人觉得平时根本不需要知道这些,会用就行了。其实阅读源码是个很好的习惯,它不只停留在知道怎么用的阶段,而是让我们知道一系列的为什么,为什么这样设计,为什么 阅读全文
posted @ 2016-03-14 20:08 我是攻城狮 阅读(4482) 评论(4) 推荐(8) 编辑
摘要: 1. 什么是跨站请求伪造(CSRF) CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同... 阅读全文
posted @ 2016-01-04 09:03 我是攻城狮 阅读(9195) 评论(9) 推荐(13) 编辑
摘要: 接口定义了一系列的行为规范,为类型定义一种Can-Do的功能。例如,实现IEnumerable接口定义了GetEnumerator方法,用于获取一个枚举数,该枚举数支持在集合上进行迭代,也就是我们常说的foreach。接口只是定义行为,具体的实现需要由具体类型负责,实现接口的方法又分为隐式实现与... 阅读全文
posted @ 2015-11-27 17:46 我是攻城狮 阅读(1522) 评论(0) 推荐(1) 编辑
摘要: 问题引出 这视乎是个完全不必要进行讨论的话题,因为linq(这里具体是linq to objects)本来就是针对集合类型的,数组类型作为集合类型的一种当然可以使用了。不过我还是想写一下,这个问题源于qq群里一位朋友的提问:.net的数组类型都隐式继承了Array类,该类是一个抽象类,并且实现了I... 阅读全文
posted @ 2015-11-09 11:40 我是攻城狮 阅读(2240) 评论(4) 推荐(1) 编辑
摘要: 前言 通过前两篇的介绍,我们知道要执行页面对象的方法,核心就是反射,是从请求获取参数并执行指定方法的过程。实际上这和asp.net mvc框架的核心思想很类似,它会解析url,从中获取controller和action名称,然后激活controller对象,从请求获取action参数并执actio... 阅读全文
posted @ 2015-11-04 16:11 我是攻城狮 阅读(1176) 评论(7) 推荐(1) 编辑
摘要: 前言 对于搞.net的朋友来说,经常会遇到关于事件和委托的问题:事件与委托有什么关系?事件的本质是什么?委托的本质又是什么?由于.net 做了大量的封装,对于初学者,这两个概念确实不怎么好理解。事件是用户与应用程序交互的基础,它是回调机制的一种应用。举个例子,当用户点击按钮时,我们希望弹出一句“您... 阅读全文
posted @ 2015-11-02 15:39 我是攻城狮 阅读(1051) 评论(0) 推荐(4) 编辑
摘要: 前言 上一篇介绍了在webform平台实现ajax的一些方式,并且实现一个基类。这一篇我们来看一个开源的组件:ajaxpro。虽然这是一个比较老的组件,不过实现思想和源码还是值得我们学习的。通过上一篇的介绍,我们知道要调用页面对象的方法,就是靠反射来实现的,关键是整个处理过程,包括反射调用方法、参... 阅读全文
posted @ 2015-11-02 09:08 我是攻城狮 阅读(1819) 评论(0) 推荐(0) 编辑
摘要: 前言 委托和事件是c#基础中两个重要的知识,平时工作中也会经常用到。接下来我会写两篇我对委托和事件的理解,欢迎拍砖。 回调函数是一种非常有用的编程机制,许多语言都对它提供了支持。回调函数是一个通过函数指针调用的函数。通常,我们会把回调函数作为参数传递给另一个函数,当某些事件发生或满足某些条件时,... 阅读全文
posted @ 2015-10-30 11:43 我是攻城狮 阅读(4044) 评论(4) 推荐(2) 编辑
摘要: 先看一道常见题目,以下代码的执行结果是什么? class A { public static int X = B.Y + 1; static void Main(string[] args) { Console.Writ... 阅读全文
posted @ 2015-10-15 19:46 我是攻城狮 阅读(5992) 评论(1) 推荐(0) 编辑
摘要: 前言 Asp.net WebForm 和 Asp.net MVC(简称MVC) 都是基于Asp.net的web开发框架,两者有很大的区别,其中一个就是MVC更加注重http本质,而WebForm试图屏蔽http,为此提供了大量的服务器控件和ViewState机制,让开发人员可以像开发Windows... 阅读全文
posted @ 2015-10-12 10:38 我是攻城狮 阅读(1705) 评论(3) 推荐(2) 编辑
摘要: 题目 4=1 + 1 + 1 + 1 =1 + 1 + 2 =1 + 3 =2 + 2 比如数字 4 可以被拆解成为如上的四种情况。那么现在给你一个vector> 把所有的结果全部的保存到这个vector>中。函数的函数体,应该是这个样子的: vector>&fun(intn){//函数... 阅读全文
posted @ 2015-09-30 14:24 我是攻城狮 阅读(782) 评论(0) 推荐(0) 编辑