一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Asp.net

C#中DateTime转换成毫秒数

var dateTimeStart = new DateTime(1970, 1, 1, 8, 0, 0); var milliseconds = DateTime.Now.Subtract(dateTimeStart).TotalMilliseconds;

龙生   03 Jul 2017
View Details

远程服务器返回错误: (401)未经授权的解决办法

1、错误号401.1 症状:HTTP 错误 401.1 – 未经授权:访问由于凭据无效被拒绝。 分析: 由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用,或者没有权限访问计算机,将造成用户无法访问。 解决方案: (1)查看IIS管理器中站点安全设置的匿名帐户是否被禁用,如果是,请尝试用以下办法启用: 控制面板->管理工具->计算机管理->本地用户和组,将IUSR_机器名账号启用。如果还没有解决,请继续下一步。 (2)查看本地安全策略中,IIS管理器中站点的默认匿名访问帐号或者其所属的组是否有通过网络访问服务器的权限,如果没有尝试用以下步骤赋予权限: 开始->程序->管理工具->本地安全策略->安全策略->本地策略->用户权限分配,双击“从网络访问此计算机”,添加IIS默认用户或者其所属的组。 注意:一般自定义 IIS默认匿名访问帐号都属于组,为了安全,没有特殊需要,请遵循此规则。 2、错误号401.2 症状:HTTP 错误 401.2 – 未经授权:访问由于服务器配置被拒绝。 原因:关闭了匿名身份验证 解决方案: 运行inetmgr,打开站点属性->目录安全性->身份验证和访问控制->选中“启用匿名访问”,输入用户名,或者点击“浏览”选择合法的用户,并两次输入密码后确定。 3、错误号:401.3 症状:HTTP 错误 401.3 – 未经授权:访问由于 ACL 对所请求资源的设置被拒绝。 原因:IIS匿名用户一般属于Guests组,而我们一般把存放网站的硬盘的权限只分配给administrators组,这时候按照继承原则,网站文件夹也只有administrators组的成员才能访问,导致IIS匿名用户访问该文件的NTFS权限不足,从而导致页面无法访问。 解决方案: 给IIS匿名用户访问网站文件夹的权限,方法:进入该文件夹的安全选项,添加IIS匿名用户,并赋予相应权限,一般是读、写。 4、C#开发程序出现问题 在System.Net中提供了一个NetworkCredential,通过它我们可以在网络中提供一个凭证,只有获得该凭证的用户才能访问相应的服务的权限。在这里我们也使用NetworkCredential。

在webconfig配置web代理,使用httpweb请求的时候不需要设置proxy属性。

http://blog.csdn.net/mang_liu/article/details/7708864

龙生   03 Jul 2017
View Details

多线程里的EF

这几天写个小功能,在多线程里用到EF,程序第一次启动总是记录到几个错误。 如果在多线程外访问一次数据库就没有问题,真是让人无奈啊~ 另外还发现log4net的实例化必须写在其他实例的前面,否则在控制台程序下不显示日志~~

龙生   29 Jun 2017
View Details

EF的开发模式到底有几种

Entity Framework(EF)的开发模式有多少种呢?有的说是三种,有的说是四种,到底哪个对呢? 先看下图: 再看这张: 那么明显开发模式是三种。 即:DateBase First(数据库优先)、Model First(模型优先)和Code First(代码优先)。 当然,如果把Code First模式的两种具体方式独立出来,那就是四种了。 Code First(New DataBase) :在代码中定义类和映射关系并通过model生成数据库,使用迁移技术更新数据库。 Code First(Existing DataBase):在代码中定义类和映射关系,给逆向工程提供工具。 Model First:在设计器中创建Model,并用Model生成数据库。所有的类由Model自动生成。 DateBase First:在设计器中逆向生成Model,并有Model自动生成所有的类。   from:http://www.cnblogs.com/jihua/archive/2013/05/23/efmoshi.html

龙生   16 May 2017
View Details

仿冒IP与伪造referer

伪造IP与伪造referer 在http协议中伪造ip的可能性研究 些日子对自定义http协议的各个数据进行了研究,对于ip伪造的问题,我当时给的建议是使用代理服务器,不过后来发现,其实可以在http协议加入一个选项,来实现一个非伪造ip的伪造ip 。如何理解呢?理由如下:~ 一、方法概述 在http协议数据头里面加入选项“x-forward-for”,例如:“x-forward-for:202.204.76.254”,这样发送出去 的包,就是一个特殊的包,在收包方看来,这个包的意思是,一个代理服务器发过来的数据包,而这个包的真是ip是“202.204.76.254”,其实还 是实现的是三次握手,但是只不过是在发包的同时,对收包方提到了一个第三者。 二、试用范围 因为现在的网站类的程序如果有IP限制的话,基本上都是会检测是不是代理服务器发送的数据的,如果是代理服务器发送的数据,那么他就把IP记为这个(透明)代理服务器发送的x-forward-for的IP。 以一段较为流行的php检测ip的代码为例: 那么大家可以看到这个IP是如何伪造的了。 三、应对方法 当然对于网站方面,这种伪造ip的情况虽然不是很多,但是如果在投票类的程序中,当然很需要这方面的检测了,呵呵。多多检测HTTP_CLIENT_IP吧。貌似这个还没有办法伪造? .. 四、总体看法 这个办法之所以称之为非伪造ip的伪造ip,主要就是利用了现在大多数网站程序检测ip的一个漏洞。所以如果网站程序能够重新审视一下自己的ip检测办法,这个方法就会慢慢失效的。呵呵。 – 伪造 referer 首先说明,伪造访问来路不是什么光明正大的事情,目的就是为了欺骗服务器。原本以为给 XMLHTTP 对象增加一个 Referer 的header 就可以,结果却没有任何作用,改用 ServerXMLHTTP 也如此。 无意间发现公司内部项目使用的 paypal 扣款程序里面有 WinHttp.WinHttpRequest.5.1 对象,它负责把客户的信用卡信息提交到 paypal 的服务器,看来是一个核心的远程访问方法,google一下发现它居然用可以成功伪造所有 http 请求的 header 信息!下面的代码通过伪造 referer 的值,假装从百度首页提交一个表单到指定的 url 去: var url = http://www.yourtarget.com ; var param = name=david&age=30 ; var obj = new ActiveXObject( WinHttp.WinHttpRequest.5.1 ); obj.Open( POST , url, false); obj.Option(4) = 13056; obj.Option(6) = false; //false可以不自动跳转,截取服务端返回的302状态。 obj.setRequestHeader( Content-Type , application/x-www-form-urlencoded ); obj.setRequestHeader( Referer , http://www.baidu.com ); obj.Send(param); WScript.Echo(obj.responseText); 保存为 xxx.js 文件,在命令行中运行 cscript.exe […]

龙生   15 May 2017
View Details

Happy 15th Birthday .NET!

Today marks the 15th anniversary since .NET debuted to the world. On February 13th, 2002, the first version of .NET was released as part of Visual Studio.NET. It seems just like yesterday when Microsoft was building its “Next Generation Windows Services” and unleashed a new level of productivity with Visual Studio.NET. Since the beginning, the .NET platform has allowed developers to quickly build and deploy robust applications, starting with Windows desktop and web server applications in 2002. You got an entire managed framework for building distributed Windows applications, […]

龙生   15 May 2017
View Details

“sgen.exe”已退出,代码为 1

解决方案:visual studio 2010 选定web项目,右键选择“属性”—“生成”,将“生成序列化程序集”设成“关闭”。 若你使用的是Visual Studio 2012,还需要在“标准”工具栏将“解决方案配置”设置为 Release 模式(Visual Studio 2012 默认使用 Release 模式发布 Web 应用),然后再进行上述操作即可。   from:http://www.cnblogs.com/songling/p/3623612.html

龙生   21 Sep 2016
View Details

5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task

对于多线程,我们经常使用的是Thread。在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于“任务的编程模型”所冲击,因为task会比thread具有更小的性能开销,不过大家肯定会有疑惑,任务和线程到底有什么区别呢?  任务和线程的区别: 1、任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。 2、任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。    一、认识Task和Task的基本使用 1、认识Task 首先来看一下Task的继承结构。Task标识一个异步操作。 可以看到Task和Thread一样,位于System.Threading命名空间下,这也就是说他们直接有密不可分的联系。下面我们来仔细看一下吧!   2、创建Task 创建Task的方法有两种,一种是直接创建——new一个出来,一种是通过工厂创建。下面来看一下这两种创建方法:

这是最简单的创建方法,可以看到其构造函数是一个Action,其构造函数有如下几种,比较常用的是前两种。

这种方式通过静态工厂,创建以个Task并运行。下面我们来建一个控制台项目,演示一下,代码如下: 要添加System.Threading.Tasks命名控件引用。

这里我分别用两种方式创建两个task,并让他们运行。可以看到通过构造函数创建的task,必须手动Start,而通过工厂创建的Task直接就启动了。 下面我们来看一下Task的声明周期,编写如下代码:

task1.Status就是输出task的当前状态,其输出结果如下: 可以看到调用Start前的状态是Created,然后等待分配线程去执行,到最后执行完成。 从我们可以得出Task的简略生命周期: Created:表示默认初始化任务,但是“工厂创建的”实例直接跳过。 WaitingToRun: 这种状态表示等待任务调度器分配线程给任务执行。 RanToCompletion:任务执行完毕。 成员名称 说明 Canceled 该任务已通过对其自身的 CancellationToken 引发 OperationCanceledException 对取消进行了确认,此时该标记处于已发送信号状态;或者在该任务开始执行之前,已向该任务的 CancellationToken 发出了信号。 有关详细信息,请参阅任务取消。 Created 该任务已初始化,但尚未被计划。 Faulted 由于未处理异常的原因而完成的任务。 RanToCompletion 已成功完成执行的任务。 Running 该任务正在运行,但尚未完成。 WaitingForActivation 该任务正在等待 .NET Framework 基础结构在内部将其激活并进行计划。 WaitingForChildrenToComplete 该任务已完成执行,正在隐式等待附加的子任务完成。 WaitingToRun 该任务已被计划执行,但尚未开始执行。    二、Task的任务控制 Task最吸引人的地方就是他的任务控制了,你可以很好的控制task的执行顺序,让多个task有序的工作。下面来详细说一下: 1、Task.Wait 在上个例子中,我们已经使用过了,task1.Wait();就是等待任务执行完成,我们可以看到最后task1的状态变为Completed。 2、Task.WaitAll 看字面意思就知道,就是等待所有的任务都执行完成,下面我们来写一段代码演示一下:

其输出结果如下: 可以看到,任务一和任务二都完成以后,才输出All task finished! 3、Task.WaitAny 这个用法同Task.WaitAll,就是等待任何一个任务完成就继续向下执行,将上面的代码WaitAll替换为WaitAny,输出结果如下:   4、Task.ContinueWith 就是在第一个Task完成后自动启动下一个Task,实现Task的延续,下面我们来看下他的用法,编写如下代码:

执行结果如下: 可以看到,task1完成之后,开始执行后面的内容,并且这里我们取得task的返回值。 在每次调用ContinueWith方法时,每次会把上次Task的引用传入进来,以便检测上次Task的状态,比如我们可以使用上次Task的Result属性来获取返回值。我们还可以这么写:

首先输出Get some data,然后执行第二个获得返回值true,最后根据判断返回Finished或error。输出结果: Get some Data! Finished 其实上面的写法简化一下,可以这样写:

输出One,这个可以看明白了吧~ […]

龙生   20 Sep 2016
View Details

线程同步(C# 和 Visual Basic)

以下各节描述了在多线程应用程序中可以用来同步资源访问的功能和类。 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行。对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应。对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请求的能力。否则,在完全满足前一个请求之前,将无法处理每个新请求。 然而,线程的异步特性意味着必须协调对资源(如文件句柄、网络连接和内存)的访问。否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线程都不知道其他线程的操作。结果将产生不可预知的数据损坏。 对于整数数据类型的简单操作,可以用 Interlocked 类的成员来实现线程同步。对于其他所有数据类型和非线程安全的资源,只有使用本主题中的结构才能安全地执行多线程处理。 有关多线程编程的背景信息,请参见: Managed Threading Basics Using Threads and Threading Managed Threading Best Practices 锁和 SyncLock 关键字 lock (C#) 和 SyncLock (Visual Basic) 语句可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。 lock 或 SyncLock 语句有一个作为参数的对象,在该参数的后面还有一个一次只能由一个线程执行的代码块。例如: C#

提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上面的示例中,锁的范围限定为此函数,因为函数外不存在任何对对象 lockThis 的引用。如果确实存在此类引用,锁的范围将扩展到该对象。严格地说,提供的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。 通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。锁定字符串尤其危险,因为字符串被公共语言运行时 (CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。某些类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot。 有关 lock 和 SyncLock 语句的更多信息,请参见以下主题: “锁定”语句(C# 参考) SyncLock 语句 监视器 监视器 与 lock 和 SyncLock 关键字类似,监视器防止多个线程同时执行代码块。 Enter 方法允许一个且仅一个线程继续执行后面的语句;其他所有线程都将被阻止,直到执行语句的线程调用 Exit。这与使用 lock 关键字一样。例如: C#

这等效于: C#

使用 lock (C#) 或 SyncLock (Visual Basic) 关键字通常比直接使用 Monitor […]

龙生   17 Sep 2016
View Details
1 19 20 21 48