A potentially dangerous Request.Path value was detected from the client 异常

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 06 月 29 日

我们在ASP.net 4.0 中使用URL导向后, 我们在访问类似如下的地址时 http://wz.csdn.net/yanjinde77/一个面试题!********/,就会报错误: 

A potentially dangerous Request.Path value was detected from the client

at System.Web.HttpRequest.ValidateInputIfRequiredByConfig()  

at System.Web.HttpApplication.ValidateRequestExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  

at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

这是因为上述地址中有*这个特殊字符存在。

如果你想不让ASP.net 替你拦截这些特殊字符,你需要设置如下Web.config的节:

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.web>
<httpRuntime requestPathInvalidCharacters="" />
</system.web>
</configuration>

注意其中的requestPathInvalidCharacters 它是一个以逗号分隔的无效字符列表。不设置它时,它默认的无效字符集(以,分割)是后面7个:<,>,*,%,&,:,\

即,不设置这个属性,默认就是如下设置:

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.web>
<httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" />
</system.web>
</configuration>

如果你想这些字符全部不受限制,就应该设置 requestPathInvalidCharacters="" , 如果是部分字符受限制,部分字符不受限制,就需要在 requestPathInvalidCharacters 中设置需要受限制的字符,不受限制的不用设置。

 

参考资料:

Experiments in Wackiness: Allowing percents, angle-brackets, and other naughty things in the ASP.NET/IIS Request URL

http://www.budoou.com/article/981320/

未能加载文件或程序集“****”或它的某一个依赖项的一种情况

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 05 月 27 日

昨天碰到了一个异常:未能加载文件或程序集“*********”或它的某一个依赖项。拒绝访问

但是这个需要加载的文件确实存在呀,它依赖的程序集也是存在,

最后用 FileMon 去分析,发现是目录和文件权限的问题

正常情况应该是下图:

image

但是,我这里成了下面的情况,这就导致了未能加载文件或程序集“****”或它的某一个依赖项的情况。

image

.NET Framework 4.0 SDK的安装

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 05 月 25 日

之前我提到 .NET Framework 4.0 GAC 部署的一些问题: .NET Framework 4.0 中如何把一个程序部署到全局应用缓存(GAC),一个解决方法就是等.NET Framework 4.0 SDK的发布。

目前 .NET Framework 4.0 SDK 已经发布了, 它是跟 Windows SDK 集成在一起发布的。即:Windows SDK for Windows 7和.NET Framework 4(WinSDK 7.1)。下载地址在:
http://www.microsoft.com/downloads/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&displaylang=en

在装此SDK前需要先装 .NET Framework 4.0, 下载地址在:
http://www.microsoft.com/downloads/details.aspx?familyid=0A391ABD-25C1-4FC0-919F-B21F31AB88B7&displaylang=en

我们如果只需要解决我之前提到的 GAC 的问题, 安装时候只需要选择 .NET Development 这一项,其他不用安装,如下图所示:

image 

默认选择安装完成后,在 C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools 目录下就有 gacutil.exe 了。

ASPX页面如何加载GAC中的组件?

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 05 月 11 日

注意这里是 ASPX 页面而不是 ASPX.cs 代码页面引用GAC的组件;

要ASPX 页面引用 GAC 中的组件,则需要做下面两步:

一、在 machine.config 中增加你的 assembly :

在 <assemblies> 节 (在 <configuration>/<system.web>/<compilation>/<compilers>/<assemblies> 可以找到这个节) 中增加下面配置信息:
<add assembly="AssemblyFileName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=5edf592a9c40680c" />

如果你想整个机子都起作用, 就需要改全局的 config 文件, 否则 只需要修改本站点的 web.config

二、 在 ASPX 页面头增加下面一行:

%@Import Namespace="YourNameSpace"%

完成了这两步,你就可以在 ASPX 中使用 GAC 中的组件了。

当然, 如果你WEB站点 bin 目录下有 AssemblyFile, 还是没有请求 GAC 中的, 而是使用的 bin 目录下的, 毕竟优先级上,先从 bin 目录下找组件。

ASPX 文件是第一次被请求时,才编译的,所以,上面步骤你不配置第一步,项目编译时是不报错的,只有执行的时候才会报错。

参考资料:

Adding assembly to GAC
http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=106

How to set an IIS Application or AppPool to use ASP.NET 3.5 rather than 2.0
http://www.hanselman.com/blog/HowToSetAnIISApplicationOrAppPoolToUseASPNET35RatherThan20.aspx

.dbmdl 文件

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 05 月 07 日

VS2010 的数据库项目的会建一个 <ProjectName>.dbmdl 文件,这个文件,在每次数据库项目被打开时候,都会被更新,如果这个文件不存在,则会自动建立一个。这个文件不应该被源代码控制,否则你会被他搞死,每次打开项目,都会改写这个文件。

<ProjectName>.dbmdl – This file is the cached project model. It should not be source controlled.  You always need read/write access to this file while the project is open in the IDE. The cache should be rebuilt for each developer on the team.

 

参考资料:

Come visit/revisit The Beer House! (Continuous Integration)
http://blogs.msdn.com/bahill/archive/2009/07/31/come-visit-revisit-the-beer-house-continuous-integration.aspx

升级vs2010我碰到的一个问题,以及解决方法

Categories: 未分类
Comments: 4 Comments
Published on: 2010 年 05 月 07 日

5.1前,把CSDN论坛的源代码升级成VS2010,升级后出现了一个怪异的问题,部署企业服务时,一会好,一会会报找不到文件:未能加载文件或程序集:“Interop.COMAdmin"。很是怪异,这个问题一直拖到今天在发现问题所在,并解决了。这个问题托这么久才解决跟一会正常一会异常很有关系。

产生的原因如下:

由于企业服务用到的组件都必须部署在GAC中,我在升级后,我企业服务部署的代码就有如下的写法,下面只是罗列出错地方的代码:

********  部署其中一个用到的组件到GAC 的DOS 命令:
c:
cd %VS100COMNTOOLS%../../../
cd "Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\"
gacutil.exe  /if $(TargetPath)
******************************  安装企业服务 的DOS 命令:
"%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe"  $(TargetPath)

问题就出在上面代码中, 部署到GAC 用到的 gacutil.exe 是 .NET Framework 4.0 的 gacutil.exe。 安装企业服务的 InstallUtil.exe 用的是 .NET Framework 2.0 的。 2.0 和 4.0 的 .NET Framework  的工具互相干扰,就导致了上面提到的一会正常,一会不正常的情况出现了。

解决方法就是统一 gacutil.exe  , InstallUtil.exe  这两个工具使用的 .NET Framework 的版本, 就一切问题都迎刃而解了。

书写SQL时也获得智能提示

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 04 月 28 日

写SQL的比写.NET程序的体验上差一等,没有智能提示,需要记住关键字,函数或者不断地Copy表字段名,自定义函数,存储过程之类的。不过在VS2010中,我们可以使用智能提示了,如下面几幅图所示:

image

在编辑器中, 输入 Shift + J (提示: VS2010 开发工具中标的是 Ctrl +J 其实应该是 Shift + J )就可以自动打开这个智能提示。

image

image

这个功能在 SQL 2008 中的 SQL Server Management Studio 也有了, 不过 SQL 2005 是没有的。 VS2010 中也是有的。 我们下面来介绍如何在 VS2010 中也有这个智能提示。

 

这个功能是如何出来的呢?

你需要按照下面步骤来创建和使用SQL Server项目,就可以获得智能提示体验。

image

新建一个SQL Server 项目,如上图所示,由于我这里新建的是 SQL Server 2008 Database Project 。新建 SQL Server 2005 的项目也是有这个智能提示的。

image

从现有数据库中导入数据库的表,存储过程,视图等,如上图所示: 选中这个数据库项目,右键菜单中选择“Import Database Objects and Settings”。这个数据库的数据库结构就会导入到这个项目中。

image

在导入数据库向导页面, 根据你的需求选择对应的项,然后点击开始就导入了这个数据。

其中 Import Extended Properties 这个选项,可以帮我们把使用 sp_addextendedproperty 增加的注释也导入出来。

按照上面的步骤导入数据库后,我们在VS2010中编写SQL时,就会获得最前面图示的智能提示的功能了。

where 命令一个快速定位工具所在的功能

Categories: 未分类
Comments: 2 Comments
Published on: 2010 年 04 月 27 日

有时候,我们希望知道我们当前使用的工具是在那个目录下的那个文件,where 命令就很好的帮助了我们。下面的例子是查找.NET 4.0 的 gacutil 命令所在位置,所以使用了 Visual Studio Command Prompt(2010) 这个命令行工具,其实这个 where 命令在很早版本操作系统中就有了。我这里最早的就是win2003操作系统,也是有这个命令的。查找的例子如下图:

image

下图输入 where gacutil , 就会返回使用这个命令行工具调用gacutil 工具,它实际调用的是哪个文件的。

image

where 命令的参数说明如下:

C:\>where /?

WHERE [/R dir] [/Q] [/F] [/T] pattern…

描述:
    显示符合搜索模式的文件位置。在默认情况下,搜索是在当前目录和 PATH
    环境变量指定的路径中执行的。

参数列表:
    /R       从指定目录开始,递归性搜索并显示符合指定模式的文件。

    /Q       只返回退出代码,不显示匹配文件列表。(安静模式)

    /F       显示所有相配文件并用双引号括上。

    /T       显示所有相配文件的文件的文件。

    pattern  指定要匹配的文件的搜索模式。通配符 * 和 ? 可以用在模式中。
             也可以指定 "$env:pattern" 和 "path:pattern" 格式; 其中
             "env" 是环境变量,搜索是在 "env" 变量的指定的路径中执行的。
             这些格式不应该跟 /R 一起使用。此搜索也可以用将 PATHEXT 变
             量扩展名附加于此模式的方式完成。

     /?      显示帮助消息。

  注意: 如果搜索成功,此工具返回错误级别 0; 如果不成功,返回 1; 如果失
        败或发生错误,返回 2。

示例:
    WHERE /?
    WHERE myfilename1 myfile????.*
    WHERE $windir:*.*
    WHERE /R c:\windows *.exe *.dll *.bat
    WHERE /Q ??.???
    WHERE "c:\windows;c:\windows\system32:*.dll"
    WHERE /F /T *.dll

C:\>

.NET Framework 4.0 中如何把一个程序部署到全局应用缓存(GAC)

Categories: 未分类
Comments: 1 Comment
Published on: 2010 年 04 月 26 日

.NET Framework 4.0中,如何把一个程序部署到全局应用缓存(GAC)中发生了相当大的变化,VS2010 自带的 MSDN 都在一些地方描述是错误的。下面是我对如何部署 .NET Framework 4.0 GAC 整理的一些知识:

以前把一个程序部署到GAC,有下面四种方法,我们下面就以这四种方法为线索,说说 .NET Framework 4.0 中的问题。

使用Global Assembly Cache tool (Gacutil.exe)。

需要注意的是:这个工具在.NET Framework 运行时中并不包含。他是SDK的一部分。 在 .NET Framework 2.0 时,我们就要单独下载 .NET Framework 2.0 SDK,或者装了 Visual Studio 后才会具有这个工具;

以我的电脑为例,我装的是win2008 R2, VS2010,我的这个工具默认就在

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\x64\gacutil.exe  目录下。

这是安装 VS2010 后给我自带的。

这个文件不能 copy 到其他目录下用, 我试过把 gacutil.exe , gacutil.exe.config copy 到其他目录下,结果就不能用了。

而单独的.NET Framework 4.0 SDK目前还没有发布,我们在Windows  SDK 的blog上可以看到,不久就会发布新版本。

所以,目前开发 .NET Framework 4.0 的程序, 如果你用到了 GAC, 这个GAC部署方法是不可用的,你不可再实际运营服务器上部署 VS2010 吧。 我们只有等 .NET Framework 4.0 SDK 。

使用 Microsoft Windows Installer 。

也就是我们把整个部署需要的组件打包到安装文件,然后安装即可。

如下图,VS2010 给我们提供了很多种常用的安装程序制作方法,只要一步步的完成即可。

image

但是,如果你是做 WEB 开发的, 你会很频繁的发布,每次发布,每次修改一个小bug,都要做一个安装程序包? 这几乎是一个非常愚蠢的做法。

 

使用 Assembly Cache Viewer (Shfusion.dll).

我们在安装了 Windows Software Development Kit (SDK) 后(装 Visual Studio 会自动给你装 SDK),访问 C:\Windows\assembly 目录时,会自动使用Windows 的一个扩展 Assembly Cache Viewer (Shfusion.dll)。 这样我们就可看到下面的图,在这里我们可以很方便的拖动一个组件进入GAC,也可以直接删除一个组件:

image

但是,如果你仔细看的话,上面的GAC是没有 .NET Framework 4.0 的。这是因为,从4.0 开始,GAC的实际目录变成了: C:\WINDOWS\Microsoft.NET\assembly 目录了,而不是 C:\Windows\assembly 。上面的方式自然也就没法用了。

所以,目前开发 .NET Framework 4.0 的程序, 如果你用到了 GAC, 这个GAC部署方法是不可用的。

我所说的MSDN中错误的就是这里,MSDN中说 .NET 4.0 仍然可以这么用,其实是不可以的。

 

使用 Mscorcfg.msc (.NET Framework Configuration Tool)

这个工具,也就是我们之前常见的“Microsoft .NET Framework 2.0 Configuration”工具;如下图所示的:

image

但是需要注意的是:.NET Framework 4.0 以及之后的版本不再支持这种方式。我们只有在开发的之前版本的.NET程序,即 .NET 1.0,1.1, 2.0, 3.0, 3.5 的程序中才可以使用它。.NET 4开始不支持的原因参看这篇文章: Security Changes in the .NET Framework 4

当我们要在 .NET 2.0, 3.0, 3.5 的程序中使用时,我们应该使用:“Microsoft .NET Framework 2.0 Configuration”工具,这个工具仍然不再 .NET Framework 运行时中,而是在 .NET Framework 2.0 Software Development Kit (SDK) 中。

.NET 1.0, 1.1 , 对应版本的运行时仍然没有这个工具,而是在 NET Framework redistributable package 中。

所以,同样,目前开发 .NET Framework 4.0 的程序, 如果你用到了 GAC, 这个GAC部署方法是不可用的。

 

小结

目前开发 .NET Framework 4.0 的程序, 如果你用到了 GAC,你会很痛苦,你只能做安装程序,这对频繁更新的 WEB 程序来说,这是不可接受的。 我们只有等到对应的 SDK 发布后,才可以把用到GAC的程序升级成 .Net Framework 4.0

 

 

参考资料:

How to: Install an Assembly into the Global Assembly Cache.
http://msdn.microsoft.com/en-us/library/dkkx7f79.aspx

Demystifying the .NET Global Assembly Cache
http://www.codeproject.com/KB/dotnet/demystifygac.aspx

Global Assembly Cache in .NET 4.0
http://www.umbraworks.net/bl0g/rebuildall/2010/02/10/Global_Assembly_Cache_in_NET_4_0

进程、线程与JVM、CLR

Categories: 未分类
Comments: 2 Comments
Published on: 2010 年 04 月 13 日

进程和线程的关系:

网上有一副很经典的图可以让我们来理解进程和线程的关系:

下面这副图是一个双向多车道的道路图,假如我们把整条道路看成是一个“进程”的话,那么图中由白色虚线分隔开来的各个车道就是进程中的各个“线程”了。

image

这副图出自:http://www.blogjava.net/pengpenglin/archive/2008/09/02/226292.html 

一些说明:

  • 这些线程(车道)共享了进程(道路)的公共资源(土地资源)。
  • 这些线程(车道)必须依赖于进程(道路),也就是说,线程不能脱离于进程而存在(就像离开了道路,车道也就没有意义了)。
  • 这些线程(车道)之间可以并发执行(各个车道你走你的,我走我的),也可以互相同步(某些车道在交通灯亮时禁止继续前行或转弯,必须等待其它车道的车辆通行完毕)。
  • 这些线程(车道)之间依靠代码逻辑(交通灯)来控制运行,一旦代码逻辑控制有误(死锁,多个线程同时竞争唯一资源),那么线程将陷入混乱,无序之中。
  • 这些线程(车道)之间谁先运行是未知的,只有在线程刚好被分配到CPU时间片(交通灯变化)的那一刻才能知道。

 

线程的生存期

当安排执行一个线程后,这个线程会经历几个状态,包括:未启动,激活,睡眠状态等,如下图显示的线程的生存期:

image

此图来自《c#线程参考手册》,这本书的电子版在CSDN有下载:http://d.download.csdn.net/down/1493065/phs415

 

如果使用Java,看下面图更容易点,其实他们描述的意思完全一样:

image

 

JVM 与 进程,线程

Java编写的程序都运行在在Java虚拟机(JVM)中,每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行的。JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出。

如下图所示:

image

上述资料参看:

JVM和JRE浅谈
http://blog.csdn.net/liufeng_cp/archive/2008/07/18/2674317.aspx

Java多线程编程总结
http://lavasoft.blog.51cto.com/62575/27069

Java 由于要考虑跨平台,所以它的进程,线程的模型比较简单, .Net 则复杂些了:

 

.Net CLR、 进程, 应用程序域, 线程

image

说明:

  • 类似于Java虚拟机,目前CLR都是存在某个进程内,即:进程加载CLR。在 .Net 4.0 中,可以进程内并存 .Net 4.0 和之前版本, 就是这个的一个典型场景(.Net 4.0 的新特性你: "In-Proc SxS“ 就是指这个)。
  • .Net 中引入了应用程序域的概念,这是进程内的进一步的逻辑分区。显然:一个进程可以包含多个应用程序域,每一个应用程序域中承载一个.NET可执行程序。这样的好处:
    • 应用程序域是.NET平台操作系统独立性的关键特性。这种逻辑分区将不同操作系统加载可执行程序的差异抽象化了。
    • 和一个完整的进程相比,应用程序域的CPU和内存占用要小的多。因此CLR加载和卸载应用程序域比起完整的进程来说也快的多。
    • 应用程序域为承载的应用程序提供了深度隔离。如果进程中一个应用程序域失败了,其他的应用程序域也能保持正常。

下面这幅图就描述了 应用程序域 所处的位置:

image

参看: CLR 全面透彻解析进程内并行 

 

参考资料:

深究Java虚拟机
http://www.chinaaspx.com/comm/dotnetbbs/Showtopic.aspx?Forum_ID=33&Id=302411&PPage=1

关于进程 线程和一些常见的多线程概念
http://www.cnblogs.com/ChrisWang/archive/2009/09/07/1563675.html

.Net Discovery 系列之五–深入浅出.Net实时编译机制(上)
http://www.cnblogs.com/isline/archive/2009/12/22/1629831.html

linux线程浅析
http://blog.chinaunix.net/u2/87597/showart.php?id=2178432

Azure Cloud Application 运行方式特点
http://tech.ccidnet.com/art/1105/20090625/1808497_1.html

读书感受 – 程序员 – C#线程参考手册(多线程技术分析)
http://www.cnblogs.com/lzhdim/archive/2009/11/27/1611510.html

多线程编程的基础知识点
http://www.blogjava.net/pengpenglin/archive/2008/09/02/226292.html

Java多线程编程总结
http://lavasoft.blog.51cto.com/62575/27069

«page 1 of 31


Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056

Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056

Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056

Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056

Warning: Creating default object from empty value in /var/www/html/wp-includes/comment-template.php on line 1056

Welcome , today is 星期一, 2017 年 09 月 25 日