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/

.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 了。

升级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 的版本, 就一切问题都迎刃而解了。

Silverlight 4 RC 的安装

MIX 2010 大会上发布了 Silverlight 4 RC。 以前因为 VS2010 RC 暂时不支持 Silverlight 4,一直没有装VS2010 RC。 现在终于可以装了。

下面就是安装的一些注意事项:

首先当然是卸载之前的版本,包括下面罗列的这些卸载项,卸载一定要卸载干净才好安装:

Microsoft Expression Blend Preview for .NET 4
Microsoft Expression Blend SDK Preview for .NET 4
Mircosoft Expression Blend 3 SDK

Microsoft Silverlight 4 Tools for Visual Studio 2010 Beta 2
Microsoft Silverlight 4 Beta SDK
Mircosoft Silverlight
Mircosoft Silverlight 3 SDK

WCF RIA Services Preview for Visual Studio 2010 (这个要优先删除,否则一旦.NET Framework 4删除后,这个就没法卸载了)
Microsoft Visual Studio 2010 Ultimate Beta 2 – ENU

Microsoft .NET Framework 4 Extended Beta2
Microsoft .NET Framework 4 Client Profile Beta2
Microsoft .NET Framework 4 Multi-Targeting Pack
Microsoft .NET Services SDK(March 2009 CTP)
Microsoft ASP.NET MVC 2
Microsoft ASP.NET MVC 2 – Visual Studio 2010 Tools
Microsoft Help 3.0 Beta2
Microsoft SQL Server Compact 3.5 SP2 Beta English
Microsoft Sync Framework Runtime v1.0 SP1 Beta(x86)
Microsoft Sync Framework SDK v1.0 SP1 Beta
Microsoft Sync Framework Service v1.0 SP1 beta(x86)
Microsoft Sync Service for ADO.NET v2.0 SP1 Beta(x86)
Microsoft Team Foundation Server 2010 Beta 2 Object Model – ENU
Microsoft Visual C++ 2010 Beta 2 x86 Runtime – 10.0.21006
Microsoft Visual F# Runtime 1.0
Microsoft Visual Studio 2010 ADO.NET Entity Framework Tool Beta 2
Visual Studio 2010 Beta 2 Tools for SQL Server Compact ENU
Visual Studio 2010 Tools for Office Runtime Beta 2 (x86)
Windows Azure Tools for Microsoft Visual Studio 2010 1.0 (11/2009) Beta 2

 

 

VS2010 RC 版的安装:

下载并安装 Microsoft Visual Studio 2010
http://www.microsoft.com/downloads/details.aspx?FamilyID=457bab91-5eb2-4b36-b0f4-d6f34683c62a&displaylang=en

 

下载并安装3个VS2010 RC的补丁

这部分信息可以参看下面两篇Scott的博客
http://blog.joycode.com/scottgu/archive/2010/02/16/115889.joy
http://blog.joycode.com/scottgu/archive/2010/03/14/115909.joy

 

KB980610 (VS 2010 RC版Intellisense崩溃问题的补丁)
https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=26662&wa=wsignin1.0

KB980920 (修补了工具提示调用和停留于标识符之上时崩溃问题的补丁)
https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=27019

 

KB981167(修补了Web Forms设计器不能向自动生成的设计器文件中正确添加控件问题的补丁)
https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=27117&wa=wsignin1.0

 

Silverlight 4 Tools for VS2010RC

下载并安装Silverlight 4 Tools for Visual Studio 2010(March 2010版)
该Tools会同时安装Silverlight Developer runtime、 SDK、 tools、 和 WCF RIA Services

Silverlight 4 Tools for Visual Studio 2010

这部分信息可以参看: http://www.silverlight.net/getstarted/silverlight-4/ 

 

Blend 4

下载并安装 Expression Blend™ 4 Beta。 这个版本才是上面版本Silverlight4可用的。
http://www.microsoft.com/downloads/details.aspx?FamilyID=6f014e07-0053-4aca-84a7-cd82f9aa989f&displaylang=en

 

一些你可能用到的支持 Silverlight 4 RC 的Toolkit

WCF RIA Services Toolkit March 2010
http://www.microsoft.com/downloads/details.aspx?FamilyID=7b43bab5-a8ff-40ed-9c84-11abb9cda559&displaylang=en

Silverlight Toolkit
http://silverlight.codeplex.com/

 

Silverlight 4 RC 的改进

Ensuring That Your Silverlight Applications Work with Silverlight 4
http://msdn.microsoft.com/en-us/library/cc645049(VS.96).aspx

Silverlight 4 RC 相对于 Beta 2 的变化
http://www.cnblogs.com/024hi/archive/2010/03/16/1686828.html

ASP.net 4.0 针对SEO的改进

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 03 月 15 日

搜索引擎优化对任何面向公众的网站来说都非常重要,ASP.net 4.0 为此就做了大量改造。这些改进包括如下:

301永久性重定向

随着时间的迁移,网站的一些页面地址会发生变化,这会导致搜索引擎收录的链接地址、用户收藏的地址失效。Response.Redirect() 就是解决这个问题的。但是Response.Redirect 有以下问题:

Response.Redirect()方法产生的是个 HTTP 302 跳转,在用户尝试访问老的URL时,会导致多余的HTTP往返。另外搜索引擎一般不会跟随多个跳转,这意味着使用一个临时转向会负面影响你的网页排名。 

我之前写过博客,介绍如何实现301跳转,“从HTTP状态 301,302,200 来看页面跳转” 那时候实现 301 跳转比较麻烦,ASP.net 4.0 为此专门增加了Response.RedirectPermanent() 方法用来解决这个问题。

简单来说,如下表所示:

HTTP状态 解释 程序代码
301 301 代表永久性转移(Permanently Moved)
即永久性重定向
Response.RedirectPermanent("test_2.aspx");
302 302 代表暂时性转移(Temporarily Moved ) Response.Redirect("test_2.aspx");

MVC 中也有类似的代码:Response.RedirectToRoute(string routeName) 和 Response.RedirectToRoutePermanent(string routeName)

Head 中的 keywords 和 description

由于搜索引擎优化作弊的原因,现在搜索引擎正在淡化这两个关键字的参考作用。比如这篇博客:“Keywords和Description–SEO高手为什么不用” 就描述了原因。但是如果可以,建议还是设置这两个关键字,ASP.net 4.0 中为方便设置这两个关键字专门做了优化,我们可以通过下面简单几行代码就可以完成动态设置:

protected void Page_Load(object sender, EventArgs e)
{
    Page.Title = "测试标题";
    Page.MetaKeywords = "测试关键字";
    Page.MetaDescription = "测试简介";
}
或者在ASPX 文件中如下写:
<%@ Page Language="C#"
Title="测试标题"
MetaKeywords = "这是我的,关键字"
MetaDescription = "这是一个简介"
AutoEventWireup="true"
CodeBehind="Test_2.aspx.cs"
Inherits="WebApplication_CacheOutput.Test_2"
%>
Scott那个例子估计是更早测试版本的,那时候是 Keywords , Description ,而不是 MetaKeywords 和 MetaDescription。

ASP.NET Web Forms也支持了URL导向

简洁、直观的URL,搜索引擎喜欢,用户也喜欢。在ASP.NET 4.0中,URL Routing既可以映射到ASP.NET MVC控制器类,也可映射到基于ASP.NET Web Forms的网页。
你甚至可以在一个项目中,混合使用含有 Web Forms 和 MVC控制器,即:使用单一一套导向规则在它们之间映射URL。
下面是一个简单的例子:
Global.asax 中注册路由规则:
void RegisterRouters(System.Web.Routing.RouteCollection routes)
{
    routes.MapPageRoute(
        "my-Test-Route",    // 路由名称--随便自己爱好起了
        "p/{key}",           // 路由规则
        "~/WebForm1.aspx"    // 该路由规则交给哪一个页面来处理
        );
    // ......  当然,你可以继续增加更多的自己的路由规则
}

void Application_Start(object sender, EventArgs e)
{
    RegisterRouters(System.Web.Routing.RouteTable.Routes);
}
测试接受请求的页面代码,为了进行测试,我们这里接受所有参数,并显示出来,方便理解:
protected void Page_Load(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("this.Page.RouteData.Values");
    sb.AppendLine("<br />");
    foreach (var item in this.Page.RouteData.Values)
    {
        sb.AppendFormat("{0}={1}<br />\r\n", item.Key, item.Value);
    }
    sb.AppendLine("this.Page.Request.QueryString");
    sb.AppendLine("<br />");
    foreach (var item in this.Page.Request.QueryString)
    {
        sb.AppendFormat("{0}={1}<br />\r\n", item, this.Page.Request.QueryString[item.ToString()]);
    }
    sb.AppendLine("this.Page.Request.Form");
    sb.AppendLine("<br />");
    foreach (var item in this.Page.Request.Form)
    {
        sb.AppendFormat("{0}={1}<br />\r\n", item, this.Page.Request.Form[item.ToString()]);
    }

    Response.Write(sb.ToString());
}

完成上述代码,我们就可以通过不同URL的请求测试了。

比如我们访问 http://localhost:3215/p/abc?s=1 ,测试的结果就是:

this.Page.RouteData.Values

key=abc

this.Page.Request.QueryString

s=1

this.Page.Request.Form

 

参考资料:

VS 2010 和 .NET 4.0 系列之《ASP.NET 4 中的SEO改进 》篇

http://blog.joycode.com/scottgu/archive/2010/01/06/115842.joy

.NET 4的新特性:图表、SEO及可扩展的输出缓存

http://www.infoq.com/cn/news/2010/02/.NET-4-Charts-SEO-Cache

Asp.Net4.0/VS2010新变化(4):SEO的改进

http://www.cnblogs.com/yjmyzz/archive/2010/03/05/1679235.html

Asp.Net4.0/VS2010新变化(3):webform中也可以直接url路由

http://www.cnblogs.com/yjmyzz/archive/2010/03/05/1679140.html

Silverlight Path的Data生成

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 03 月 10 日

Path的Data数据有下面几种生成方式:

  1. 来自其它矢量图。比如使用 Expression Design,就可以直接粘贴来自其它软件的矢量图形,然后选择导出,导出时做如后选择:文件->导出->导出属性->格式->XAML Silverlight 画布,即可得到XAML格式的矢量图形,也就是Path。
  2. 使用转换路径,比如,我们要把文字转成图形,相当于印刷行业里的文字转曲,可以直接用 Expression Blend。选中对象->路径->转换为路径,即可。
  3. 自己动手写。当然这也是最难的方式。不过对于简单图形来说非常有用。用Design生成的数据量很大,手写就会变得很简洁。这篇博客就是要介绍Path命令的格式,以及如何写一些简单的Path。

首先是Path命令列表

下面这个地址有详细描述,Silverlight路径标记语法,我下面用表格的方式给出,更直观点。

说明:

  • 下面命令中,语法部分显示的是单个空格,实际上使用单个空格的地方也可以使用多个空格;
  • 命令前后的空格也不是必须的;
  • 如果结果字符串比较明确,则无需使用逗号或空白将两个数字隔开。例如,2..3 解释为两个数字:"2."和".3"。同样,2-3 包含两个数字:"2"和"-3"。
  • 下面的命令中,绝大多数大写表示绝对值,小写表示相对于前一点的值。

 

类型 命令格式 解释
移动指令  Move Command(M) M x,y

m x,y
比如:M 100,240 或 m 100,240

大写的 M 指示 x,y 是绝对值;
小写的 m 指示 x,y 是相对于上一个点的偏移量,如果是 (0,0),则表示不存在偏移。
当您在 move 命令之后列出多个点时,即使您指定的是线条命令,也将绘制出连接这些点的线。

绘制指令
(Draw Command)

通过使用一个大写或小写字母输入各命令:

其中大写字母表示绝对值,
小写字母表示相对值。

线段的控制点是相对于上一线段的终点而言的。

依次输入多个同一类型的命令时,可以省略重复的命令项;

例如,L 100,200 300,400 等同于 L 100,200 L 300,400。

直线:Line(L)

格式:
L 结束点坐标
或:
l 结束点坐标。
比如:L 100,100 或 l 100 100。
坐标值可以使用x,y(中间用英文逗号隔开)或x y(中间用半角空格隔开)的形式。

水平直线: Horizontal line(H)

格式:
H x值

h x值
(x为System.Double类型的值)
绘制从当前点到指定x坐标的直线。
比如:H 100或h 100,也可以是:H 100.00或h 100.00等形式。

垂直直线: Vertical line(V)

V y值

v y值
(y为System.Double类型的值)
绘制从当前点到指定y坐标的直线。
比如:V 100或y 100,也可以是:V 100.00或v 100.00等形式。

三次方程式贝塞尔曲线:
Cubic Bezier curve(C)

C 第一控制点 第二控制点 结束点

c 第一控制点 第二控制点 结束点
通过指定两个控制点来绘制由当前点到指定结束点间的三次方程贝塞尔曲线。
比如:C 100,200 200,400 300,200 或 c 100,200 200,400 300,200
其中,点(100,200)为第一控制点,点(200,400)为第二控制点,点(300,200)为结束点。

二次方程式贝塞尔曲线:
Quadratic Bezier curve(Q)

Q 控制点 结束点

q 控制点 结束点
通过指定的一个控制点来绘制由当前点到指定结束点间的二次方程贝塞尔曲线。
比如:q 100,200 300,200。其中,点(100,200)为控制点,点(300,200)为结束点。

平滑三次方程式贝塞尔曲线:
Smooth cubic Bezier curve(S)

S 控制点 结束点

s 控制点 结束点
通过一个指定点来“平滑地”控制当前点到指定点的贝塞尔曲线。

比如:S 100,200 200,300

平滑二次方程式贝塞尔曲线:
smooth quadratic Bezier curve(T)

T 控制点 结束点

t 控制点 结束点
与平滑三次方程贝塞尔曲线类似。在当前点与指定的终点之间创建一条二次贝塞尔曲线。控制点假定为前一个命令的控制点相对于当前点的反射。如果前一个命令不存在,或者前一个命令不是二次贝塞尔曲线命令或平滑的二次贝塞尔曲线命令,则此控制点就是当前点。

比如:T 100,200 200,300

椭圆圆弧: elliptical Arc(A) A 尺寸 圆弧旋转角度值 优势弧的标记 正负角度标记 结束点
或:
a 尺寸 圆弧旋转角度值 优势弧的标记 正负角度标记 结束点

在当前点与指定结束点间绘制圆弧。

  • 尺寸(Size): System.Windows.Size类型,指定椭圆圆弧X,Y方向上的半径值。
  • 旋转角度(rotationAngle):System.Double类型。
  • 圆弧旋转角度值(rotationAngle):椭圆弧的旋转角度值。
  • 优势弧的标记(isLargeArcFlag):是否为优势弧,如果弧的角度大于等于180度,则设为1,否则为0。
  • 正负角度标记(sweepDirectionFlag):当正角方向绘制时设为1,否则为0。
  • 结束点(endPoint):System.Windows.Point类型。

比如:A 5,5 0 0 1 10,10

关闭指令  (close Command):
可选的关闭命令
用Z或z表示 用以将图形的首、尾点

Silverlight 版的华容道游戏

Categories: 未分类
Comments: 2 Comments
Published on: 2010 年 03 月 08 日

游戏如下:

 

你也可以访问这个地址来玩:

http://ghj1976.blob.core.windows.net/silverlight/TestPage_SilverlightApp_HuaRongDao_v1.html

游戏说明:

  • 游戏共有27关(前25关都是有难度的,最后2关,则是非常简单的)。
  • 在棋子上按下按钮,拖动棋子时,棋子移动。
  • 点击关卡名,则可以重新开始本关;关卡名的左右可以前一关,下一关的移动。

更多功能可以自己来试玩。

游戏的代码在:

http://ghj1976.blob.core.windows.net/silverlight/Solution_HuaRongDao_v1.zip

是使用 VS2010 Beta编写的,这是我学习Silverlight写的一个例子,代码并不优雅,见谅。

Silverlight 资源的使用

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 03 月 08 日

我们在Silverlight 项目中,新加一个文件,比如一个图片文件,这个文件的属性会有下面2个选项,这两个选项决定了这个图片资源如何存储,如何使用。

先说简单的,资源文件的 Copy to OutPut Directory 属性, 这个属性有如下三个选项:

image

他们都是在程序编译或者部署时,判断此资源文件是否要同步用的。

Do not copy 不做数据同步
Copy always 每次都会被同步过去
Copy if newer 当有新版本存在时,才会被同步过去

 

Build Action 属性则复杂多了, 下面是VS2010中, Silverlight 4 项目资源文件的Build Action 属性截图。

image

注意,上面罗列了一些不适合资源文件的 Build Action 属性,在使用资源文件时,可以忽略这些。

 

None 资源既不会被集成到程序集内,也不会打包到xap包中。不过我们可以通过设置CopyToOutputDirectory选项让其自动拷贝到xap包所在目录。
这种情况下, 访问这个图片的相对Uri需要以"/"开始。

适用场景:

在大多数情况下,我们希望把video/audio文件放到xap的外面,因为这种文件一般都比较大,会影响silverlight应用的加载,而且一般的视频音频文件都是压缩格式的,放到xap中也不会起到减少他们文件大小的作用。
类似图片视频这种资源文件生成操作为None时和他们没有被添加到项目里是一样的,都可以用绝对Uri进行引用。

Compile 不适合用于资源文件。
类文件要用"Compile"生成操作, 就是指项目里.cs或.vb文件。
Content 资源会被打包在Xap包里面。
这种情况下, 访问这个图片的相对Uri需要以"/"开始。
在这种方式下,如果没有在xap中找到图片文件,那么silverlight会自动从当前xap应用所在的文件夹下来找所需图片文件,
如果还没有找到那么就触发ImageFailed事件,
这种方式比较适合在多个程序集引用相同文件时采用。
Embedded Resource

这种方式会把文件嵌入到程序集中,silverlight无法通过Uri引用在xaml和c#里对这个文件进行使用,微软不建议在silverlight采用这种方式在程序集里嵌入资源。
如果有这种需求可以用
Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(string path)相关的方法得到文件的stream引用。

ApplicationDefinition

silverlight程序的入口xaml文件(默认就是App.xaml)应该设置为这个"应用定义"。其他文件都不适合用这个。

Page 不适合用于资源文件。
所有的用户控件, 页面和子窗体(usercontrol/page/childwindow)的xaml文件应该采用的生成操作。
如果改为别的方式那么会导致后台对应的代码文件无法链接到这个xaml文件。 采用"Page" build action时xaml里的错误会导致工程无法正确生成。
CodeAnalysisDictionary 代码分析使用,Silverlight中可以忽略
Resource 资源会被打包在程序集内部。
选择这种生成方式后,该资源文件会被嵌入到该应用的程序集中,就是说打开生成的xap是看不到这个文件的。

可以用相对于当前的XAML文件的相对Uri访问,
如<Image Source="silverlight.png" />
或是<Image Source="./silverlight.png" />,

在子文件夹里的可以用
<Image Source=”./images/sl.jpg” />访问到。

最保险的方式是采用特有的程序集资源URI访问,格式为
<Image Source="/{assemblyShortName};component/Foo.jpg"/>,

这种方式还可以引用到xap中的其他程序集中的图片。

这种生成方式的系统资源可以直接用Application.GetResourceStream(uri).Stream在代码里来得到。

SplashScreen

"SplashScreen"是这个选项是WPF的启动画面使用的。  silverlight启动加载画面是用的其他方式实现的, 所以在silverlight里不要用这个方式。

EntityDeploy 这个是EntityFramework采用的生成方式, 在silverlight里是没用。

 

参考资料:

分析silverlight里的URI引用资源文件的各种情况
http://bbs.blueidea.com/viewthread.php?tid=2941697

Silverlight图片相对路径的设置
http://www.cnblogs.com/yangfan/archive/2009/12/14/1623647.html

关于Silverlight资源文件(如:图片)的放置位置及其引用(相对路径)
http://www.cnblogs.com/star250/archive/2009/10/15/1583665.html

Silverlight资源文件
http://msdn.microsoft.com/zh-cn/library/cc296240(VS.95).aspx

图片等资源的引用路

我眼中的VS2010

Categories: 未分类
Comments: Comments Off
Published on: 2010 年 03 月 08 日

VS2010正式版马上就要发布了,从09年国庆节后开始使用VS2010 Beta2测试版,到现在也已4个月了,VS2010的的变化很大,但是给我带来比较大影响的反而是几个小的功能变革。

VS2010改变了我对WPF观念

在听说VS2010是WPF开发之前,我总觉得WPF由于要实现这么多绚丽的界面,在性能上肯定损耗的不少。在之前,由于对美好界面的渴望,我也自己学习过WPF,由于公司日常工作用不到WPF,也就是写写小程序玩玩,但是能用WPF来开发VS2010,在此之前我是无论如何都没有想到的,非常吃惊,这就是我当初听到VS2010要用WPF来开发的感受。在使用VS2010这么久后,VS2010测试版虽然有时候会时不时没有响应,但是它的速度,性能,一点都不比我装在同一台机子上的VS2008差。VS2010 RC 版据说解决了那些没有响应的问题,同时速度优化了很多,由于我要用到Silverlight 4 的开发,就没装 VS2010 RC 版,VS2010的正式版确实很值得期待。网上说 VS2010 RC 版对性能的改进体验非常深刻,参看:.NET 4 RC版 发布了 这篇博客。

代码智能提示的改进

.NET Framework 的函数库越来越强大,也越来越多,不是特长常用的,函数名确实难以记住,VS2008 开发环境的智能提示是根据方法或者属性的起始字母来选择的,如下图所示:

image

VS2010中则搜索的是包含搜索词的所有函数和属性。这样如下图所示,我们搜索 edit ,不仅仅可以搜索出 EditIndex,还可以搜索出字母中间带Edit的方法,属性,事件。

image

这样,那些我们没有精确记忆的属性和方法就会出现在智能提示中,对我们的编程非常方便实用。

有关这方面的内容你可以参看: VS 2010 和 .NET 4.0 系列之《VS 2010代码智能提示的改进》篇

 

导航和查询代码的改进

当我们阅读一个代码非常膨大,而不是又不是特别熟悉它的代码结构时,如何找到并定位代码,会是一个难题。这个功能VS2010新增的功能对我们非常有用。如下图:(Ctrl+逗号)的键盘快捷键就可以打开下面的“Navigate To(导航到)”对话框。在Search terms 中我们输入2个关键字:“cache action”,就可以搜索出包含这两个关键字的方法,类,属性,事件。这跟上面的智能提示一样,是包含,而不是以某个字开头。

image_thumb_7E22DE68

有关这方面的内容你可以参看: VS 2010 和 .NET 4.0 系列之《在VS 2010中查询和导航代码》篇

 

鼠标滚轮滚动,对应字体大小的变化

这个功能对演示代码非常有帮助,比如公司内部,我在给大家演示一些代码时,由于现在的屏幕分辨率越来越大,我又习惯用最大的分辨率,这样稍稍离我远点的,就看不清楚编辑器的内容,以前我是在演示时,修改VS开发环境编辑器的默认字体大小,不演示了,再改回去,现在我不需要反复的改来改去,直接用鼠标中键滚轮来回滚动,就可以轻松实现字体的放大和缩小,非常实用,非常方便,我经常使用它。

使编程更容易;让我们对WPF更有信心。这就是我对VS2010的感觉。

ASP.net 4.0 的新特性: 可扩展输出缓存

Categories: 未分类
Comments: 3 Comments
Published on: 2010 年 02 月 25 日

ASP.NET 1.0 引入了输出缓存的概念,允许我们把网页,控件输出保存在内存的缓存中。然后在之后的web请求中,ASP.NET可以通过从缓存中取出和使用现成的输出(而不是再次执行网页重新从头生成输出),以实现快速地将内容输出,提高应用的性能。

ASP.NET的输出缓存是相当灵活的,它允许你根据网页/查询字符串/表单提交参数等来缓存不同版本的内容;它也允许你基于访问你的应用的客户端的浏览器类型或者用户语言选项来缓存不同版本的内容。你可以配置ASP.NET在一个特定的时间内缓存某个特定的输出缓存,你还可以配置ASP.NET基于某个外部事件(例如,缓存内容基于的数据库改变了)动态地使得缓存条目失效。

但ASP.NET V1->V3.5中的输出缓存有一个限制,就是缓存存储本身不是可扩展的,缓存的内容总是保存在内存中的。

ASP.NET 4.0 中 为输出缓存添加了扩展点,现在允许开发人员配置一个或多个定制的输出缓存提供器(output-cache provider)。输出缓存提供器可以使用任何存储机制来持久化缓存内容。比如文件,其他进程的内存,其他服务器的进程,memcached 等其他分布式缓存。

下面就是一个简单的演示例子,演示如何自己定制一个基于文件的输出缓存提供器。

要实现我们自己的输出缓存提供器,我们需要自己从 System.Web.Caching.OutputCacheProvider 抽象类派生一个自己的输出缓存提供器类,即实现这个抽象类的下面4个抽象方法:

public override object Add(string key, object entry, DateTime utcExpiry)
{
}

public override object Get(string key)
{
}

public override void Remove(string key)
{
}

public override void Set(string key, object entry, DateTime utcExpiry)
{
}

然后,你可以通过在应用的 web.config 文件中使用<outputCache>元素的新<providers>节将其注册,配置ASP.NET 4来使用你定制的输出缓存提供器:如下所示。

<configuration>
<system.web>
    <caching>
      <outputCache defaultProvider="HongjunGuoFileCache">
        <providers>
          <add name="HongjunGuoFileCache" type="WebApplication_CacheOutput.HongjunGuoOutputCache,WebApplication_CacheOutput"/>
        </providers>
      </outputCache>
    </caching>
</system.web>
</configuration>

在上面,我加了一个新的输出缓存提供器(我将其命名为“HongjunGuoFileCache”),是用WebApplication_CacheOutput.dll程序集中的“WebApplication_CacheOutput.HongjunGuoOutputCache”类实现的。我还配置ASP.NET,将我的“WebApplication_CacheOutput.HongjunGuoOutputCache”实现作为默认的输出缓存实现来使用(每当内容需要输出缓存时),- 这是通过设置<outputCache>元素的 “defaultProvider”属性实现的。

至此,当我在任意一个.aspx网页的顶部加一个OutputCache指令时,内容就会通过使用我的ScottOutputCache提供器被缓存和保存起来:

<%@ OutputCache Duration="60" VaryByParam="None" %>

我这里书写的 “WebApplication_CacheOutput.HongjunGuoOutputCache”类 的完整代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace WebApplication_CacheOutput
{
    [Serializable]
    internal class CacheItem
    {
        public DateTime Expires;
        public object Item;
    }


    public class HongjunGuoOutputCache : OutputCacheProvider
    {

        private readonly string CachePath = HttpContext.Current.Server.MapPath(@"~/CacheFiles/");


        public override object Add(string key, object entry, DateTime utcExpiry)
        {
            string fileName = Path.Combine(CachePath, string.Format("{0}.txt", key));
            if (File.Exists(fileName)) return entry;

            string path = Path.GetDirectoryName(fileName);
            if (!Directory.Exists(path)) Directory.CreateDirectory(path);

            using (var file = File.OpenWrite(fileName))
            {
                var item = new CacheItem { Expires = utcExpiry, Item = entry };
                var formatter = new BinaryFormatter();
                formatter.Serialize(file, item);
            }
            return entry;
        }


        public override object Get(string key)
        {
            string fileName = Path.Combine(CachePath, string.Format("{0}.txt", key));
            if (!File.Exists(fileName)) return null;

            CacheItem item = null;
            using (var file = File.OpenRead(fileName))
            {
                var formatter = new BinaryFormatter();
                item = (CacheItem)formatter.Deserialize(file);
            }

            // 是否过期,或者文件损毁
            if (item == null || item.Expires <= DateTime.Now.ToUniversalTime())
            {
                Remove(key);
                return null;
            }
            return item.Item;
        }



        public override void Remove(string key)
        {
            string fileName = Path.Combine(CachePath, string.Format("{0}.txt", key));

            if (File.Exists(fileName)) File.Delete(fileName);
        }


        public override void Set(string key, object entry, DateTime utcExpiry)
        {
            if (entry == null) return;
            string fileName = Path.Combine(CachePath, string.Format("{0}.txt", key));

            string path = Path.GetDirectoryName(fileName);
            if (!Directory.Exists(path)) Directory.CreateDirectory(path);

            var item = new CacheItem { Expires = utcExpiry, Item = entry };
            using (var file = File.OpenWrite(fileName))
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(file, item);
            }
        }
    }
}

这里我把要缓存的东西放入 CacheItem 实体二进制序列化到一个文件中了。

文件是保存在 Web 项目的根目录的 CacheFiles 目录下的。

由于这里传入的 key 字符中会有 / \ 这样的斜杠存在, 所以这里也为它建立了必须的目录。 你也可以把 key  md5 加密后,根据加密算法生成文件或者目录。

执行这个程序,我们在 根目录的 CacheFiles 目录下 就会看到一些文件产生了。

我们调试这个程序,就会看到缓存的工作原理,很简单明了。

参考资料:

ASP.NET 4.0: Writing custom output cache providers

http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx

VS 2010 和 .NET 4.0 系列之《ASP.NET 4中的可扩展输出缓存》篇

http://blog.joycode.com/scottgu/archive/2010/02/11/115877.joy

«page 1 of 6


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 日