资讯详情

.NET盲点面试

1.net运行机制 使用Asp.net 进行动态Web开发,写好Web应用程序,即动态页面,并部署到Web服务器,如IIS中; 客户在浏览器输入地址,请求相应的动态页面; Web 根据客户端的要求,服务器对Web编译或解释应用程序并生成HTML流回客户端 客户浏览器解释HTML流,并显示为Web页面 2.Post和Get区别 GET浏览器返回时无害,POST请求将再次提交。 GET浏览器将主动提出请求cache,而POST不,除非手动设置。 GET请求只能进行url编码,而POST支持多种编码方法。 GET请求参数将完全保留在浏览器历史记录中,POST参数不会保留。 GET请求在URL中间传输的参数有长度限制,POST么有。 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。 GET比POST更不安全,因为参数直接暴露在外URL所以不能用来传递敏感信息。 GET参数通过URL传递,POST放在Request body中。 .Net页面生命周期 请求页:页面请求发生在页面生命周期开始前。 开始:在开始阶段,将设置页面属性,如Request和Response。在此阶段,页面还将确定请求是回发请求还是新请求,并设置IsPostBack属性。 初始化页面:在页面初始化期间,可以使用页面中的控件并设置每个控件UniqueID属性。若当前请求为回发请求,则回发数据尚未加载,且控件属性值尚未恢复为视图状态。 加载页面:在加载过程中,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。 验证:验证期间,将调用所有验证程序控件Validate该方法将设置每个验证程序控件和页面IsValid属性。 回发事件处理:如果请求是回发请求,所有事件处理程序都将被调用。 呈现页面:在页面呈现过程中,视图状态将保存在页面中,然后页面将调用每个控制器将其呈现的输出提供给页面Response属性的OutputStream。 卸载页面:当完全呈现页面并将页面发送到客户端并准备丢弃时,调用卸载页面属性(如Response和Request)并进行清理。 如何优化数据库中的大量数据 1.SQL查询句子优化 使用索引 建立索引可以提高查询速度,首先要考虑where及order by,group by在列中建立索引。 借助explain(查询优化神器)选择更好的索引和优化查询句 SQL 的 Explain 通过图形化或基于文本的方式详细说明 SQL 如何执行语句的每个部分,何时执行,以及执行效果。 选择更好的索引列,或者需要很长时间SQL语句进行优化达到对查询速度的优化。 不要在任何地方使用SELECT * FROM语句。 不要在索引列中操作或使用函数 尽量使用查询limit减少返回行数 使用查询缓存,并分配尽可能多的内存MYSQL做缓存 2.主从复制,读写分离,负载均衡 目前,大多数主流关系数据库都提供了主从复制的功能。通过配置两个(或多个)数据库的主从关系,一个数据库服务器的数据可以更新到另一个服务器。网站可以利用数据库的功能实现数据库的读写分离,从而提高数据库的负载压力。系统的读操作远远超过写操作,因此写操作的发展方向master,读操作发向slaves操作(简单的轮询算法决定使用哪个slave)。 利用数据库的读写分离,Web在编写数据时,服务器访问主数据库(master),主数据库通过主从复制同步数据更新(slave),这样当Web服务器读取数据时,可以从数据库中获取数据。这一方案使得在大量读操作的Web应用程序可以很容易地读取数据,而主数据库只能承受少量的写入操作,还可以实现数据热备份,可以说是一举两得。 3.数据库分表、分区、分库 1、分表 表的访问效率可以通过分表提高。有两种拆分方法: 垂直拆分 将主键和一些列放在一个表中,然后将主键和另一个列放在另一个表中。如果一个表中的一些列是常用的,而另一些不是常用的,则可以垂直拆分。 水平拆分 将数据按一列或多列数据的值放入两个独立的表中。 2、分区 分区是将一个表的数据分成多个块。这些块可以在磁盘或不同磁盘上。分区后,表面仍然是一个表,但数据分散在多个位置。这样,多个硬盘可以同时处理不同的要求,从而改进磁盘I/O读写性能相对简单,包括水平分区和垂直分区。 3、分库 分库根据不同的业务将相关表切割到不同的数据库中,如web、bbs、blog等库。 Ajax核心对象,以及Ajax的写法。 全称Asynchronous JavaScript and XML; 异步的 JavaScript 和 XML; 与服务器交换数据,更新部分网页内容,无需重新加载整个页面; 能够实现局部刷新,大大减少资源浪费; 用户不需要任何浏览器插件,但需要允许JavaScript在浏览器上执行; 创建快速动态网页的技术; 传统网页(不使用 AJAX)如需更新内容,必须重载整个网页; 步骤 建立XMLHTTPRequest对象 注册回调函数 使用open方法设置与服务器端交互的基本信息 设置发送的数据,开始与服务器端交互 判断交互是否结束,响应是否正确,并根据需要获取服务器端返回的数据,更新页面内容 五种写法 Ajax Post get getJson AjaxSubmit $.ajax({ url:“http://www.microsoft.com”, //请求的url地址 dataType:“json”, //返回格式为json async:true,//请求是否异步,默认为异步,这也是ajax重要特性 data:{“id”:“value”}, //参数值 type:“GET”, ///请求方式 beforeSend:function(){ ///请求前的处理 }, success:function(req){ ///请求成功时处理 }, complete:function(){ //请求完成的处理 }, error:function(){ //请求处理错误 } }); 怎样防止sql注入 1.含义:SQL注入(SQLi)可以恶意执行的注射攻击SQL语句。它通过任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL绕过应用程序安全措施注入漏洞;Web验证和授权应用程序,并检索整个应用程序SQL数据库内容;也可以使用SQL注入添加、修改和删除数据库中的记录。 2.SQL注入攻击类型 带内注入 这是一个典型的攻击,攻击者可以通过相同的通信发起攻击并获得结果。这是通过两种带内技术完成的 ● 基于错误的SQL注:从显示的错误信息中获取数据库的信息 ● 基于联合的SQL注入:依靠攻击者的能力UNION ALL被盗信息的结果与法律结果有关。 这两种技术都依赖于攻击者修改应用程序发送的SQL,以及浏览器中显示的错误和返回的信息。如果应用程序开发人员或数据库开发人员不能正确参数他们在查询中使用的值,它将成功。两者都是试错法,可以检测到错误。 盲注入 也称为推理SQL盲注入攻击不会直接从目标数据库中显示数据;相反,攻击者会仔细检查行为中的间接线索。HTTP响应中的详细信息,一些用户输入的空白网页和数据库响应一些用户输入需要多长时间,这些都可以是线索,这取决于攻击者的目标。他们还可以指向攻击者尝试的另一个SQLi攻击途径。 带外注入 当攻击者不能单独直接查询时,这种攻击有点复杂 - 攻击者在响应攻击中实现目标时可能会使用这种攻击。通常,攻击者会制造SQL当这些句子呈现给数据库时,它们会触发数据库系统与攻击者控制的外部服务器之间的连接。这样,攻击者就可以收集。 二级注入是带外注入攻击。在这种情况下,攻击者将提供SQL注入将由数据库系统的单独行为存储和执行。当二级系统行为发生时(它可能类似于基于时间的操作或其他典型管理员或用户使用数据库触发的事情),并执行攻击者SQL当伸出到达系统时,发生了攻击者控制。 防止Sql注入攻击 不要使用动态SQL 避免直接放入用户提供的输入SQL句子中;最好使用准备好的句子和参数查询,这样更安全。 不要将敏感数据保留在纯文本中 加密存储在数据库中的私有/机密数据;这可以为攻击者成功排放敏感数据提供另一级保护。限制数据库权限和特权 将数据库用户的功能设置为最低要求;这将限制攻击者在试图获得访问权限时可以执行的操作。 避免直接向用户显示数据库错误 攻击者可以使用这些错误信息获取数据库信息。 访问数据库Web使用应用程序Web防火墙的应用程序(WAF) 这为面向Web该应用程序提供保护,有助于识别SQL注入试验;它还可以帮助防止SQL注入到应用程序(和数据库)。 与数据库交互的定期测试Web应用程序 这样做可以帮助捕获可能允许SQL注入新错误或回归。 将数据库更新为最新的可用修复程序 这可以防止攻击者利用旧版本中已知的弱点/错误。

Ado.net常用对象有哪些? Connection:用于连接数据库的对象表示数据源的唯一连接。主要是打开程序和数据库之间的连接。没有连接对象,数据库就无法从数据库中获取数据。Close和Dispose的区别Close以后还可以Open,Dispose以后则不能再用。 Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连接到数据源。

DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。 DataSet:表示内存中数据的缓存(可以视为一个暂存区),可以把它想像成一个临时的数据库,可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来,DataSet是放在内存中的。DataSet 的能力不只是可以储存Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。DataSet可以存多个表DataTable、DataTableTable包含若干DataRow,而且是断开式的,不用每进行一次操作就对数据库进行更新,从而提高了效率。 DataReader:当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的,只能[通过游标(游标是处理结果集的一种机制,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。)]读取当前行的数据,而且这些数据是只读的,并不允许作其它的操作。DataReader对象与DataSet最大的不同是有连接式的,每次对数据库进行存取都会影响到数据库。但是DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。并且使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。 总结 ADO.NET 使用Connection 对象来连接数据库,使用Command 或DataAdapter对象来执行SQL语句,并将执行的结果返回给DataReader 或 DataAdapter ,然后再使用取得的DataReader 或DataAdapter 对象操作数据结果。

如何理解委托,事件是不是委托 区别:委托是一个类型,事件修饰的是一个对象 委托可以在声明它的类外部进行调用,而事件只能在类的内部进行调用。 总结: 1、委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的指针。 2、委托和事件没有可比性,因为委托是类型,事件是对象 3、其实事件是委托的一个修饰符,加了event(事件)修饰之后,委托就被阉割了,假设这个加了修饰符的事件称为事件1,通过事件1我们可以更好地控制注册和注销,也就是对于一个外部类,那么他只能“注册自己+=、注销自己-=”,例如上面的ClassA,如果我们事件的注册是在ClassA内部进行的,那么它就只能注册自己内部的方法到事件上。另外,外界也不能主动地触发一个事件。事件只能add、remove自己,不能赋值。也就是说事件只能+=、-=,不能= 。当我们反编译以上例子的源程序的时候,我们可以发现事件内部就是一个private的委托和add、remove两个方法

有一个数组A,向这个数组随机插入100个数值,但不能重复。 ArrayList myList = new ArrayList(); //创建集合对象 Random rnd = new Random(); //创建随机生成器对象 while (myList.Count < 100) { //限制集合中的元素数 int num = rnd.Next(1, 101); //随机生成1到100的数 if (!myList.Contains(num)) //判断集合中是否已经存在 myList.Add(num); //添加到集合中 } for (int i = 0; i < 100; i++) //遍历一维数组 intArr[i] = (int)myList[i]; //为一维数组赋值 for (int i = 0; i < intArr.Length; i++){ //遍历赋值后的一维数组 Console.Write(intArr[i] + " “); //输出遍历的元素 } 什么是事物,什么是 什么是死锁? 1.事务的概念 含义:事务由单独单元的一个或者多个sql语句组成,在这个单元中,每个mysql语句时相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条sql语句一旦执行失败或者产生错误,整个单元将会回滚,所有受到影响的数据将会返回到事务开始以前的状态;如果单元中的所有sql语句均执行成功,则事务被顺利执行。 事务的属性 原子性:一个事务不可在分割,要么都执行要么都不执行。 一致性:一个事务的执行会使数据从一个一致状态切换到另一个一致的状态。 隔离性:一个事务的执行不受其他事物的干扰 持久性: 一个事务一旦提交,则会永久的改变数据库的数据 事务的创建 隐式事务:事务没有明显的开启和结束的标记 显式事务:事务具有明显的开启和结束的标记 前提:必须先设置自动提交功能为禁用 数据库的隔离级别 对于同时运行的多个事务,当这些事务访问数据库中的相同的数据时,如果没有采取必要的隔离机制就会产生并发问题: 脏读,不可重复读,幻读。 数据库事务的隔离性:数据库系统必须具有隔离并发运行各个事务的能力,使他们不会相互影响避免并发问题。 一个事物与其他事务隔离的程度称为隔离级别。隔离级别越高,数据一致性就越好,但并发性就越弱。 锁的概念 锁(LOCKING)是最常用的并发控制机构。是防止其他事务访问指定的资源控制、实现并发控制的一种主要手段。锁是事务对某个数据库中的资源(如表和记录)存取前,先向系统提出请求,封锁该资源,事务获得锁后,即取得对数据的控制权,在事务释放它的锁之前,其他事务不能更新此数据。当事务撤消后,释放被锁定的资源。当一个用户锁住数据库中的某个对象时,其他用户就不能再访问该对象 锁的模式 排他锁:当数据对象被加上排它锁时,其他的事务不能对它读取和修改。 共享锁:加了共享锁的数据对象可以被其他事务读取,但不能修改。 死锁 一般情况只发生锁超时,就是一个进程需要访问数据库表或者字段的时候,另外一个程序正在执行带锁的访问(比如修改数据),那么这个进程就会等待,当等了很久锁还没有解除的话就会锁超时,报告一个系统错误,拒绝执行相应的SQL操作。 发生死锁的情况比较少,比如一个进程需要访问两个资源(数据库表或者字段),当获取一个资源的时候进程就对它执行锁定,然后等待下一个资源空闲,这时候如果另外一个进程也需要两个资源,而已经获得并锁定了第二个资源,那么就会死锁,因为当前进程锁定第一个资源等待第二个资源,而另外一个进程锁定了第二个资源等待第一个资源,两个进程都永远得不到满足。 下列方法有助于最大限度地降低死锁: (1)按同一顺序访问对象。 (2)避免事务中的用户交互。 (3)保持事务简短并在一个批处理中。 (4)使用低隔离级别。 (5)使用绑定连接。 按同一顺序访问对象 如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。 避免事务中的用户交互 避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。 保持事务简短并在一个批处理中 在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。 保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。 使用低隔离级别 确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。 使用绑定连接 使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。 维护数据库的完整性,一致性,你喜欢用触发器还是自写业务逻辑,为什么? 触发器一经定义,那么任何用户对表的操作(增,删,改)均由服务器激活相应的触发器,在DBMS核心层进行集中地完整性约束。 自己写业务逻辑在应用程序中定义,容易遗漏,定义时必须按照关系顺序,否则会报错,在处理大量关系是对程序员的细心程度要求比较高,还比较繁琐 触发器是用来加强数据的完整性约束和业务规则的。它是由用户自己定义的根据自己的需求,比较灵活。它又是由DBMS控制的又十分安全可靠。 简述Soap SOAP 是基于 XML 的简易协议,可使应用程序在HTTP之上进行信息交换。 或者更简单地说:SOAP 是用于访问网络服务的协议。 SOAP 指简易对象访问协议 SOAP 是一种通信协议 SOAP 用于应用程序之间的通信 SOAP 是一种用于发送消息的格式 SOAP 被设计用来通过因特网进行通信 SOAP 独立于平台 SOAP 独立于语言 SOAP 基于 XML SOAP 很简单并可扩展 SOAP 允许您绕过防火墙 SOAP 将被作为 W3C 标准来发展 用户控件,自定义控件服务器控件的区别 Web用户控件 易于创建 为使用可视化设计工具的使用者提供有限的支持 每个应用程序中需要控件的一个单独副本 不能添加到VisualStudio中的工具箱 适用于静态布局 Web 自定义控件 难于创建 为使用者提供完全的可视化设计工具支持 仅在全局程序集缓存中需要控件的单个副本 可以添加到VisualStudio中的工具箱 适用于动态布局 什么是多态,怎么运用多态。 1.多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。这就是多态,这种特性称为多态性。 2.多态的分类 多态性分为两种,一种是编译时的多态性,一种是运行时的多态性。 编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。 运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中运行时的多态性是通过覆写虚成员实现。 编译时多态:重载(overload) 重载(overload):重载指的是同一个类中有两个或多个名字相同但是参数不同的方法,(注:返回值不能区别函数是否重载),重载没有关键字。 注意: 从重载的定义来看,重载是一种编译时多态 重载不需要事先定义可重载的方法,即没有关键字 重载只是针对一个类内部的几个参数不同,名称相同的方法。 运行时多态:重写 重写有两种,一种是override修饰符,另一种使用new修饰符,下面会举例说明两种重写的使用方法和异同。 重写(override):也称过载,重写是指子类对父类中虚函数或抽象函数的“覆盖”(这也就是有些书将过载翻译为覆盖的原因),但是这种“覆盖”和用new关键字来覆盖是有区别的。 要点: a.多态是面向对象的重要特性之一,指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。 b.多态分为两种:一种是编译时多态,使用重载实现;另一种是运行时多态,使用重写实现; c.重写有两种,一种使用override关键词,另一种使用new关键词 d.new重写实际上是对父类方法的隐藏,被覆盖的父类方法可以调用得到。因此new可以重写(或说是隐藏)的父类方法不一定要定义为虚方法或抽象方法。只是如果父类方法是虚方法或抽象方法时会覆盖父类方法,如果不是,则隐藏。 e.重载和覆盖的发生条件: 重载,必然发生在一个类中,函数名相同,参数类型或者顺序不同构成重载,与返回类型无关 重写,必然发生在基类和派生类中,其类函数用virtual修饰,派生类用override修饰 覆盖,在子类中写一个和基类一样名字(参数不同也算)的非虚函数,会让基类中的函数被隐藏,编译后会提示要求使用New关键字 new 修饰隐藏,在子类中可以通过new 隐藏父类的方法 f.new覆盖与重写、重载的区别: 当子类与父类的参数不同时 当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载) 当基类函数是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载;因为参数不同,所以不是重写) 当子类与父类的参数相同时 当基类函数不是虚函数时,基类函数将被隐藏。(因为子类和基类不在同一范围内,所以不是重载,因为基类不是虚函数,所以是隐藏不是重写) 当基类函数是虚函数时,基类函数将被覆盖。(因为子类和基类不在同一范围内,所以不是重载) API的接口怎么写? 1.完全开放的接口 有没有这样的接口,谁都可以调用,谁都可以访问,不受时间空间限制,只要能连上互联网就能调用,毫无安全可言。 实话说,这样的接口我们天天都在接触,你查快递,你查天气预报,你查飞机,火车班次等,这些都是有公共的接口。 我把这称之为裸奔时代。代码如下: /// /// 接口对外公开 /// /// [HttpGet] [Route(“NoSecure”)] public HttpResponseMessage NoSecure(int age) { var result = new ResultModel() { ReturnCode = 0, Message = string.Empty, Result = string.Empty }; var dataResult = stulist.Where(T => T.Age == age).ToList(); result.Result = dataResult; return GetHttpResponseMessage(result); } 2.接口参数加密(基础加密) 你写个接口,你只想让特定的调用方使用,你把这些调用的人叫到一个小屋子,给他们宣布说我这里有个接口只打算给你们用,我给你们每人一把钥匙,你们用的时候拿着这把钥匙即可。 这把钥匙就是我上文说到的参数加密规则,有了这个规则就能调用 这有安全问题啊,这里面的某个成员如果哪个不小心丢了钥匙或者被人窃取,掌握钥匙的人是不是也可以来掉用接口了呢?而且他可以复制很多钥匙给不明不白的人用。 相当于有人拿到了你的请求链接,如果业务没有对链接唯一性做判断(实际上业务逻辑通常不会把每次请求的加密签名记录下来,所以不会做唯一性判断),就会被重复调用,有一定安全漏洞,怎么破?先看这个场景的代码,然后继续往下看! /// /// 接口加密 /// /// [HttpGet] [Route(“SecureBySign”)] public HttpResponseMessage SecureBySign([FromUri]int age, long _timestamp, string appKey, string _sign) { var result = new ResultModel() { ReturnCode = 0, Message = string.Empty, Result = string.Empty }; #region 校验签名是否合法 var param = new SortedDictionary<string, string>(new AsciiComparer()); param.Add(“age”, age.ToString()); param.Add(“appKey”, appKey); param.Add(”_timestamp", _timestamp.ToString()); string currentSign = SignHelper.GetSign(param, appKey); if (_sign != currentSign) { result.ReturnCode = -2; result.Message = “签名不合法”; return GetHttpResponseMessage(result); } #endregion var dataResult = stulist.Where(T => T.Age == age).ToList(); result.Result = dataResult; return GetHttpResponseMessage(result); } 3.接口参数加密+接口时效性验证(一般达到这个级别已经非常安全了) 继上一步,你发现有不明不白的人调用你的接口,你很不爽,随即把真正需要调用接口的人又叫来,告诉他们每天给他们换一把钥匙。和往常一样,有个别伙伴的钥匙被小偷偷走了,小偷煞费苦心,经过数天的踩点观察,准备在一个月黑风高的夜晚动手。拿出钥匙,捣鼓了半天也无法开启你的神圣之门,因为小偷不知道你天天都在换新钥匙。 小偷不服,经过一段时间琢磨,小偷发现了你们换钥匙的规律。在一次获得钥匙之后,不加思索,当天就动手了,因为他知道他手里的钥匙在第二天你更换钥匙后就失效了。 结果,小偷如愿。怎么破?先看这个场景的代码,然后继续往下看! /// /// 接口加密并根据时间戳判断有效性 /// /// [HttpGet] [Route(“SecureBySign/Expired”)] public HttpResponseMessage SecureBySign_Expired([FromUri]int age, long _timestamp, string appKey, string _sign) { var result = new ResultModel() { ReturnCode = 0, Message = string.Empty, Result = string.Empty }; #region 判断请求是否过期—假设过期时间是20秒 DateTime requestTime = GetDateTimeByTicks(_timestamp);

if (requestTime.AddSeconds(20) < DateTime.Now) { result.ReturnCode = -1; result.Message = “接口过期”; return GetHttpResponseMessage(result); } #endregion #region 校验签名是否合法 var param = new SortedDictionary<string, string>(new AsciiComparer()); param.Add(“age”, age.ToString()); param.Add(“appKey”, appKey); param.Add("_timestamp", _timestamp.ToString());

string currentSign = SignHelper.GetSign(param, appKey);

if (_sign != currentSign) { result.ReturnCode = -2; result.Message = “签名不合法”; return GetHttpResponseMessage(result); } #endregion

var dataResult = stulist.Where(T => T.Age == age).ToList(); result.Result = dataResult;

return GetHttpResponseMessage(result); } 4.接口参数加密+时效性验证+私钥(达到这个级别安全性固若金汤) 继上一步,你发现道高一尺魔高一丈,仍然有偷盗事情发生。咋办呢?你打算下血本,给每个人配一把钥匙的基础上,再给每个人发个暗号,即使钥匙被小偷弄去了,小偷没有暗号,任然无法如愿,而且这样很容易定位是谁的暗号泄漏问题,找到问题根源,只需要给当前这个人换下钥匙就行了,不用大动干戈。

但这个并不是万无一失的,因为钥匙毕竟还有可能被小偷搞到。代码如下:

/// /// 接口加密并根据时间戳判断有效性而且带着私有key校验 /// /// [HttpGet] [Route(“SecureBySign/Expired/KeySecret”)] public HttpResponseMessage SecureBySign_Expired_KeySecret([FromUri]int age, long _timestamp, string appKey, string _sign) { //key集合,这里随便弄两个测试数据 //如果调用方比较多,需要审核授权,根据一定的规则生成key把这些数据存放在数据库中,如果功能扩展开来,可以针对不同的调用方做不同的功能权限管理 //在调用接口时动态从库里取,每个调用方在调用时带上他的key,调用方一般把自己的key放到网站配置中 Dictionary<string, string> keySecretDic = new Dictionary<string, string>(); keySecretDic.Add(“key_zhangsan”, “D9U7YY5D7FF2748AED89E90HJ88881E6”);//张三的key, keySecretDic.Add(“key_lisi”, “I9O6ZZ3D7FF2748AED89E90ZB7732M9”);//李四的key var result = new ResultModel() { ReturnCode = 0, Message = string.Empty, Result = string.Empty }; #region 判断请求是否过期—假设过期时间是20秒 DateTime requestTime = GetDateTimeByTicks(_timestamp); if (requestTime.AddSeconds(20) < DateTime.Now) { result.ReturnCode = -1; result.Message = “接口过期”; return GetHttpResponseMessage(result); } #endregion #region 根据appkey获取key值 string secret = keySecretDic.Where(T => T.Key == appKey).FirstOrDefault().Value; #endregion #region 校验签名是否合法 var param = new SortedDictionary<string, string>(new AsciiComparer()); param.Add(“age”, age.ToString()); param.Add(“appKey”, appKey); param.Add(“appSecret”, secret);//把secret加入进行加密 param.Add("_timestamp", _timestamp.ToString()); string currentSign = SignHelper.GetSign(param, appKey); if (_sign != currentSign) { result.ReturnCode = -2; result.Message = “签名不合法”; return GetHttpResponseMessage(result); } #endregion var dataResult = stulist.Where(T => T.Age == age).ToList(); result.Result = dataResult; return GetHttpResponseMessage(result); } 接口参数加密+时效性验证+私钥+Https(我把这个级别称之为金钟罩,世间最安全莫过于此) 并发,高并发,并行? 并发和并行的区别 并发:当有多个线程在操作时,如果系统只有一个CPU,把CPU运行时间划分成若干个时间段,分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态。这种方式我们称之为并发(Concurrent)。并发=间隔发生 并行:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。并行=同时进行 区别:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。 高并发是短时间内大量访问和请求,例如12306抢票和天猫双11活动,想系统能够适应高并发状态,则需要全面优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化……而多线程只是其中解决方法之一。 .net数据库加密怎么写? 直接给方法:开始—>运行,输入cmd,接着输入以下内容 加密: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pef “connectionStrings” “你的Web项目路径” 解密: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -pdf “connectionStrings” “你的Web项目路径” .NET为版本的路径自行修改,其中connectionStrings连接字符串的名称。 需要注意的是,加密过程中使用了一个基于本机的密钥,这意味着解密过程必须在同一台计算机上完成。如果是将加密后的Web.config文件移动到其它计算机上,那么Web.config文件中的连接字符串将不能够正常解密。 下面显示的是通过代码方式对数据库连接字符串加密,代码如下: https://www.cnblogs.com/liuguanghai/p/3752505.html 18:MVC视图怎么调用? 调用视图方式有两种: 一:直接调用(不通过controller)

  @Html.Partial("../Shared/Error"); 二:通过controller调用   @Html.Action("Dismode","Shared") 注:   Action、RenderAction加载方法的视图,执行Controller→ Model → View的順序,然後把产生的页面带回到原来的View中再回传。 Partial、RenderPartial直接加载视图文件内 调用分部视图的示例: 新建一个控制器: 返回部分视图 public class AdminController : Controller { public ActionResult UpdateAdmin() {       var testObj = new List() { "aaa", "bbb", "ccc" }; return PartialView("UpdateAdmin", testObj ); } } 在Views 的Shared文件夹添加一个视图 UpdateAdmin 调用视图的几种方法 1. Jquery 调用 $(function () { $("#load").load("/Admin/UpdateAdmin"); }) 2 . Html.Action 调用 如下: @Html.Action("UpdateAdmin","Admin") 3. 直接调用 不经过Controller 如下: @Html.Partial("UpdateAdmin", new List { "ccc", "ddd", "eee" }) 网站的加密方式 Base64加密方式(可逆) MD5加密 MD5算法具有以下特点: 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。 2、容易计算:从原数据计算出MD5值很容易。 3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。 4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。 钥匙串加密方式 对称加密算法 优点:算法公开、计算量小、加密速度快、加密效率高、可逆 缺点:双方使用相同钥匙,安全性得不到保证 现状:对称加密的速度比公钥加密快很多,在很多场合都需要对称加密, 算法: 在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等。不同算法的实现机制不同,可参考对应算法的详细资料 相较于DES和3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准 nECB :电子代码本,就是说每个块都是独立加密的 nCBC :密码块链,使用一个密钥和一个初始化向量 (IV)对数据执行加密转换 ECB和CBC区别:CBC更加复杂更加安全,里面加入了8位的向量(8个0的话结果等于ECB)。在明文里面改一个字母,ECB密文对应的那一行会改变,CBC密文从那一行往后都会改变。 RSA加密(非对称加密算法)(Secruty.framework系统库) 存储过程怎么定义? 存储过程:存储在数据库里面的处理数据的过程(一堆sql语句)。 存储过程有参数;可以有返结果。 数据库里叫存储过程;C#里叫方法.存储过程就相当于C#里的方法。 前面学的if--else/while/变量/insert/select等,都可以在存储过程中使用。 优点: 执行速度更快——在数据库中保存的存储过程SQL语句都是编译过的 允许模块化程序设计——类似方法的复用 提高系统安全性——防止SQL注入 减少网络流量——只要输出存储过程名称 系统存储过程 由系统定义,存放在master数据库中 名称以“sp_”开头或“xp_”开头,自定义的存储过程可以以usp_开头。 1.创建存储过程 create proc ddclass---新建存储过程---- as begin select * from classes end execute ddclass--查询存储过程---- 2.创建带参数的存储过程 declare @cid --声明变量-- create procedure Studentdd(@cid int=1) as select *from Student where Id=@cid end execute Studentdd --执行调用存储过程--- 3.修改带参数的存储过程,[参考上面把参数id=@cid修改为name=@name] alter procedure Studentdd --必须有建好的存储过程才能修改 ( @name varchar(10) ) as select * from Student where Name=@name end execute Studentdd 4.修改和执行(查询)带参数的存储过程没有默认值的参数,在调用的时候必须传递参数,有默认值的可以不传 alter procedure Studentdd ( @name varchar(10) ) as select * from students where Name=@name execute Studentdd @name='刘海涛' ----执行(查询)带参数的---- winForm窗体传值 1.父窗体传值给子窗体。 方法1:通过Form类构造方法的重载传参。 using System; using System.Windows.Forms;

namespace WindowsForms跨窗体传值大全 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

     private void button1_Click(object sender, EventArgs e)
     {
         Form2 f2 = new Form2(textBox1.Text);
         f2.ShowDialog();
     }  
 }

} 方法2:通过外部可访问的中间变量传参。 using System; using System.Windows.Forms; namespace WindowsForms跨窗体传值大全 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string str;//public类型的实例字段 private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); str = textBox1.Text;//注意,这句不能放在f2.ShowDialog();的后面,否则会先执行textBox2.Text = f1.str;再执行str = textBox1.Text; f2.ShowDialog(); } } } 2.子窗体传值给父窗体。 方法1:通过Owner设置窗口归属来传值。 方法2:通过提供外部可访问的属性和DialogResult的状态来传值(这个例子同时实现了父传子、子传父)。 方法3:通过委托事件来传值。(这种方式可以实现不同控件数据实时联动的复杂功能) 案列:https://www.cnblogs.com/xh6300/p/6063649.html 什么叫反射? 反射定义: 反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以利用反射对它们进行访问。 使用场景 需要访问程序元数据的特性。 检查和实例化程序集中的类型。 在运行时构建新类型。使用System.Reflection.Emit中的类。 执行后期绑定,访问在运行时创建的类型的方法。 Vue与Jquery的优缺点? 1.jquery介绍:想必大家都用过jquery吧,这个曾经也是现在依然最流行的web前端js库,可是现在无论是国内还是国外他的使用率正在渐渐被其他的js库所代替,随着浏览器厂商对HTML5规范统一遵循以及ECMA6在浏览器端的实现,jquery的使用率将会越来越低 2.vue介绍:vue是一个兴起的前端js库,是一个精简的MVVM。从技术角度讲,Vue.js 专注于 MVVM 模型的 ViewModel 层。它通过双向数据绑定把 View 层和 Model 层连接了起来,通过对数据的操作就可以完成对页面视图的渲染。当然还有很多其他的mvmm框架如Angular,React都是大同小异,本质上都是基于MVVM的理念。 然而vue以他独特的优势简单,快速,组合,紧凑,强大而迅速崛起 3.vue和jquey对比 jQuery是使用选择器( ) 选 取 D O M 对 象 , 对 其 进 行 赋 值 、 取 值 、 事 件 绑 定 等 操 作 , 其 实 和 原 生 的 H T M L 的 区 别 只 在 于 可 以 更 方 便 的 选 取 和 操 作 D O M 对 象 , 而 数 据 和 界 面 是 在 一 起 的 。 比 如 需 要 获 取 l a b e l 标 签 的 内 容 : )选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。比如需要获取label标签的内容: )选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是在一起的。比如需要获取label标签的内容:(“lable”).val();,它还是依赖DOM元素的值。 Vue则是通过Vue对象将数据和View完全分离开来了。对数据进行操作不再需要引用相应的DOM对象,可以说数据和View是分离的,他们通过Vue对象这个vm实现相互的绑定。这就是传说中的MVVM。 Vue.js是什么? 看到了上面的框架模式介绍,我们可以知道它是属于MVVM模式的框架。那它有哪些特性呢? 其实Vue.js不是一个框架,因为它只聚焦视图层,是一个构建数据驱动的Web界面的库。 Vue.js通过简单的API(应用程序编程接口)提供高效的数据绑定和灵活的组件系统。 Vue.js的特性如下: 1.轻量级的框架 2.双向数据绑定 3.指令 4.插件化 23.svn https://www.runoob.com/svn/svn-intro.html 什么叫EF? 含义:EF框架是微软的.NET中ORM(对象关系映射)框架。 微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。EF提供变更跟踪、唯一性约束、惰性加载、查询事物等。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。 EF有三种使用场景,1. 从数据库生成Class,2.由实体类生成数据库表结构,3. 通过数据库可视化设计器设计数据库,同时生成实体类。 Code First、DBFirst、Model First CodeFirst 领域设计时先定义实体类,用实体类生成数据库 DbFirst 从数据库生成实体类 Model First 使用Visual Studio实体设计器,设计ER,同时生成Entity类和DB 24.MVC的理解和优缺点的总结 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务数据、逻辑、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。 MVC是一种框架模式,说到底是一种框架,而不是一种设计模式,框架通常是代码重用,而设计模式是设计重用,而架构则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。 优点:MVC 式的出现不仅实现了功能模块和显示模块的分离,同时它还提高了应用系统的可维护性、可扩展性、可移植性和组件的可复用性 1:耦合性低   视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,[例如,改写jsp,html,css,javascirpt的代码,并不需要重启服务器]同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可【例如,换表名查询,更改一些查询的条件,或者使用动态sql还是静态的sql,只用更改model即可】。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。 2:重用性高   随着技术的不断进步,需要用越来越多的方式来访问应用程序。MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。【例如,模型层实现了同样的分页,不同的视图层可以用一万种不同的显示方法,例如百度搜索下面的分页和谷歌搜索下面的分页】MVC使开发和维护用户接口的技术含量降低。 3:部署快   使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。【例如,前端后端可以分工作业,效率高,方便多开发人员间的分工】 4:可维护性高   分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。【例如:如果想改业务逻辑,只用改业务逻辑,如果想改视图,只用改视图,如果想增加功能,只需要增加即可,分层最大的好处就是容易后期维护降低维护成本,和增加新的功能,提高代码重用性,从而提高开发效率】 5:有利软件工程化管理   由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。控制器也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。【因为控制器重点在于分配,更好的结合视图和模型】 缺点: 1:没有明确的定义   完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。同时由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。 2:不适合小型,中等规模的应用程序   花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。【这个是最明显的缺点,例如我们仅仅需要到数据库查信息,如果不分层设计我们可以直接从视图型层到模型去访问,效率上会有所提高,如果以代码的复杂性为代价,多了一层,代码量大大增加,在这个时候就降低了开发效率】 3:增加系统结构和实现的复杂性   对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 4:视图与控制器间的过于紧密的连接   视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。【例如,不可能总是在jsp页面中直接访问模型,一般放在逻辑控制层进行处理,servlet】 5:视图对模型数据的低效率访问   依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。【例如,页面的有一部分数据我并没有更新,但是提交到模型层照样会去获得返回显示 】 6:一般高级的界面工具或构造器不支持模式   改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,会造成MVC使用的困难。 总结:   优点:分层,结构清晰,耦合性低,大型项目代码的复用性得到极大的提高,开发人员分工明确,提高了开发的效率,维护方便,降低了维护成本。

缺点:简单的小型项目,使用MVC设计反而会降低开发效率,层和层虽然相互分离,但是之间关联性太强,没有做到独立的重用 25什么是ASP.NET Core ASP.NET Core 是一个新的开源和跨平台的框架,用于构建如 Web 应用、物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序。ASP.NET Core 应用可运行于 .NET Core 和完整的 .NET Framework 之上。它整合了原来ASP.NET中的MVC和WebApi框架,你可以在 Windows、Mac 和 Linux 上跨平台的开发和运行你的 ASP.NET Core 应用。 .net core 是一个跨平台的高性能开源框架用具生成基于云连接的Internet的新的应用程序,可以建造web应用程序和服务, lot应用和移动后端,可以在Windows,macOS,和Linux上进行开发和部署 ASP.NET Core的特点 ASP.NET Core 在架构上做出了一些改变,这些改变会使它成为一个更为精简并且模块化的框架。在project.json文件中我们可以发现,ASP.NET Core 不再基于 System.Web.dll(我们在project.json中见到的大部分都是Microsoft打头) ,基于一系列颗粒化的,并且良好构建的 NuGet 包,结合智能提示,它能够让你通过仅仅包含需要的 NuGet 包的方法来优化你的应用。一个更小的应用程序接口通过“只为你需要的功能付出”(pay-for-what-you-use)的模型获得的好处包括更可靠的安全性、简化服务、改进性能和减少成本。 生成webui和webapi的统一场景, 集成新式客户端框架和开发工作流, 基于环境的云就绪配置系统, 内置依赖注入,(可以使用第三方替换) 轻型的高性能模块化的HTTP请求管道, 能够在IIS,nginx,Apache,docker上进行委托管或在自己的进程中进行托管, 定目标到.net core ,时可以使用并行应用版本控制, 简化新式的web开发工具, 开源代码和以社区为中心, 且.net core 完全作为nuget包提供,借助nuget包可以将应用优化减少到只包含到必须的依赖项,提升了安全性,减少了维护和提高性能asp.net core 与客户端框架 angular react bootstrap 可以无缝集合 通常 asp.net core用.net standard 库组成 使用.net standard2.0 编写的应用可以在net standard2.0 支持的任何位置运行

标签: f1压力继电器1414zb4m连接器1619zb4m连接器e112l静态中间继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台