2008年9月19日星期五

在Visual studio里调试XSLT

在XML菜单和XML Editor工具栏里.

有调试的选项.一个是运行,显示结果HTML页面.一个是调试,可以逐行运行XSLT文件(当然,要提供XML文件)
>>查看全文...

HTTP调试工具软件Fiddler

HTTP、调试工具、网页调试
微软的Fiddler 包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,他非常灵活性非常棒,可以支持众多的http调试任务。

Fiddler 是用C#写出来的。它还是一个http调试代理,它能 够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http通讯,设置断点,以及Fiddle 所有的“进出”的数据(指cookie,html,js,css等文件,这些都可以让你胡乱修改的意思)。 Fiddler 要比其他的网络调试器要更加简单,因为它仅仅暴露http通讯还有提供一个用户友好的格式。

Fiddler 包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,他非常灵活性非常棒,可以支持众多的http调试任务。Fiddler 是用C#写出来的。

Fiddler支持断点调试概念,当你在软件的菜单—rules—automatic breakpoints选项选择beforerequest,或者当这些请求或响应属性能够跟目标的标准相匹配,Fiddler就能够暂停Http通讯, 情切允许修改请求和响应。这种功能对于安全测试是非常有用的,当然也可以用来做一般的功能测试,因为所有的代码路径都可以用来演习。

用户可以加入一个Inspector插件对象,来使用.net下的任何语言来编写Fiddler扩展。RequestInspectors 和 ResponseInspectors提供一个格式规范的,或者是被指定的(用户自定义)Http请求和响应视图。

通过显示所有的Http通讯,Fiddler可以轻松的演示哪些用来生成一个页面,通过统计页面(就是Fiddler左边的那个大框)用户可以很轻松的使用多选,来得到一个WEB页面的“总重量”(页面文件以及相关js,css等)你也可以很轻松得看到你请求的某个页面,总共请求了多少次,以及多少字节被转化了。

另外,通过暴露HTTP头,用户可以看见哪些页面被允许在客户端或者是代理端进行缓存。如果要是一个响应没有包含Cache-Control 头,那么他就不会被缓存在客户端。

http://www.fiddlertool.com/Fiddler2/version.asp
>>查看全文...

2008年9月15日星期一

网站地图(Sitemap)常见问题解答

网站地图(Sitemap)常见问题解答
星期二, 五月 06, 2008

转载自:谷歌中文网站管理员博客

上个月,Trevor参加了在芝加哥举行的搜索引擎战略大会,并在“网站地图:滥用了,误用了还是用对了?”分会场发言。会上我们收到了很多很好的问题,我们也从我们的帮助讨论区收到一些反馈,在这里我们给一个常见问题解答:

问: 我提交了一份网站地图,但我的网址还没有被抓取/索引。难道网站地图不是专门为此而设的么?
答: 提交一个网站地图可帮助您确保Google知悉你站点上的有关URL。它特别有用,尤其当您的内容不是很容易被我们的爬虫发现时(例如页面都只能通过表单 访问)。但并不是说,我们保证这些网址将被抓取或索引。我们利用从网站地图得到的信息来增强我们平时的爬行和发现过程。

问:如果网站地图不能帮我自动抓取和索引,请问一个站点地图能做什么?
答:网站地图为Google提供信息以帮助我们更好地理解您的网站。这包括,确保我们知道您所有的URL,它们何时被更新,更新频率如何,以及它们的相对重要性。另外,如果您通过网站管理员工具提交您的网站地图,我们会显示一些统计信息,例如你网站的网址被索引的数量。

问:站点地图会帮我得到更好的排名吗?
答:网站地图并不影响你页面的实际排名。当然,如果它能帮你获得更多的网站抓取(因为它让我们知道了我们以前不知道的网址,以及/或者帮助我们知道了你网站的URL的优先级),这就能够使你的网站在我们的索引增加存在量和被显示的次数。

问:如果我把所有页面的优先级都设置为1.0,会不会使他们比别人优先级设为0.8的页面的排名更高(或被抓取的速度更快)?
答:不会。正如在我们的帮助中心所说,“优先级排名只是说明特定网址相对于您网站上其他网址的重要性,并不会影响网页在搜索结果中的排名”。如果您所有的页面有相同的优先级,这等同于你没有提供任何优先级信息。

问:如果每个URL的所有的元数据( , 等)都是相同的,或者如果我不知道它们的元数据是不是准确的,提交这样的网站地图有没有价值?
答:如 果某一特定标签的值对所有在网站地图中的URL都是一样的,在您的网站地图中就没必要包括该标签。当然,包括了也没有害处,但它本质 上和没有提交任何信息是一样的,因为它不能帮助区分你的URL。如果您不确定你的元数据是否是准确的(例如,你不知道某个网址在什么时候被最后修改) ,最好是为那些URL略去该标签, 这比仅仅造一个可能不准确的值要好。

问:我听说有人提交了一份网站地图,然后他的网站很快就受到惩罚。网站地图会对你们有害处吗?
答:只有当它从很高很高的地方落在你身上时才会 :)。一个玩笑。正儿八经的回答:如果有人提交了一份网站地图后就被惩罚了,这纯属巧合。 Google从不会因为你提交了一份网站地图而惩罚你。

问:我把我的网站地图放在那里?一定要放在我的网站的根目录下吗?
答:不久前,我们开通了网站地图跨区递交。也就是说,你可以把你的网站地图放在任何地方,只要你的网站通过了网站管理员工具验证。这些网站包括:

• 网站地图所在网站
• 在网站地图中的URL中被提及的那些网站
注意,跨区提交的网站地图可能只对Google行得通,对其他搜索引擎可能无效。

问:我的网管为我的网站建了一个网站地图,我可以只提交该网站地图吗?我对XML没有概念。
答: 为(通常是HTML)而建的网站地图是为了帮助人们浏览你的网站。这和为搜索引擎而建的XML网站地图是有区别的。他们两个都是有用的,最好是两个都有。你的域上的网站地图对搜索 引擎找到你的内容也是有帮助的(因为爬行程序会循着你的链接找到其他页) 。不过,如果你提交一个HTML网站地图来作为搜索引擎的网站地图,网站管理员工具将报告一个错误,因为一个HTML页面不是我们的一个可识别的网站地图格式。另 外,如果您创建一个XML网站,你就可以给我们提供比HTML网站地图(仅仅是一堆链接)更多的资料 。 了解更多关于我们支持的网站地图格式。

问:哪种网站地图格式是最好的?
答:我们推荐sitemaps.org界定的XML网站地图协议。XML网站地图便于被升级:你可以从简单的开始(仅列出你的URL) ,但--跟文本文件网站地图不一样--您可以在以后轻松升级一个XML站点地图,以包括更多元数据。 同时,XML网站地图也比一个Atom或RSS feed提交的网站地图更全面,因为feeds通常只会列出你最近期的URL (而不是您想让搜索引擎知道的所有的网站)。

问:如果我有多个网址指向同样的内容,我可以用我的网站地图来标明对该内容我的首选URL吗?
答:是的。虽然我们不能保证我们的算法会将该URL显示在搜索结果中,在网站地图中标明对该内容首选URL还是有帮助的。我们在决定显示哪个URL在我们的搜索结果中时,我们会连同其他信号一起考虑你的首选。 了解更多关于重复内容的信息。

问:请问一个URL在一个网站地图文件中的位置重要吗?放在文件开始的URL会比放在文件尾部的URL得到更好的处理吗?
答:不重要,不会。

问:如果我的网站有多个部分组成(如博客,论坛,以及相册),我应该为整个网站只提交一个网站地图,还是提交多个网站地图 (一个部分一个地图)?
答:提交网站地图的多少由你定(至多这些 限制)。用你觉得容易维护的方式来组织他们。如果你创建多个网站地图,您可以使用网站地图索引文件把他们全部列出来。
>>查看全文...

2008年9月14日星期日

SQLite,轻量级数据库

SQLite是一个开源轻量级嵌入式文件型数据库。

1.开源

SQLite是开源软件,以C语言写成,网上有大量各种不同语言和环境下的接口(比如asp.net 2.0 provider)。你可以用SQLite进行任何非商业或商业开发。

2.轻量经
就象其名字一样,SQLite只不过是一个250KB的dll文件,如果去掉一些特性的话只有150KB。

3.嵌入式
SQLite无需安装,没有多余的依赖项,直接复制DLL既可运行。
SQLite直接在宿主程序的进程空间中运行。

SQLite应用范围广泛,可以直接在各种平台,各种语言下运行,比如.net compact framework。

4.文件型
SQLite不是client/server型的数据库,一个数据库的信息都保存在一个文件中。


5.高速
SQLite的读取速度明显高于大型关系数据库。
client/server数据库是运行在单独的进程中,而SQLite在宿主进程空间运行,仅仅进程间数据传递,client/server数据库就已经吃了大亏。

6. 支持ACID特性和大部分SQL92
ACCESS是没有ACID(原子,一致,孤立,并且持久的)特性的。

7. 数据库大小基本没有限制,具说大于100G性能会下降。

在用于网站开发时,SQLite最大的优势在于不受制于空间服务商,无需购买昂贵的数据库空间。直接部署在WEB空间里既可。

不足之处:SQLite最大的不足是写入并发能力,读取是没问题的,但是当一个线程进入写入时,其它线程就无法读取,只能等待。

相关网址:官方网址: http://www.sqlite.org/
.net provider(可用于asp.net开发)http://sourceforge.net/projects/adodotnetsqlite
http://sourceforge.net/projects/sqlite-dotnet2(新项目)
>>查看全文...

2008年9月13日星期六

XML/XSLT客户端转换

当前主流浏览器都开始支持XML/XSLT转换,建立以XML/XSLT技术为基础的网站成为可能。具体方法是,服务器端返回一个XML文件,这个XML文件引用某个(比如服务器上的)XSLT文件,浏览器以XSLT为模板将XML文件转换为XHTML显示出来,这样服务器可以提供XML而不是HTML给用户来显示网络页面。

这种技术的优点有:
1,呈现工作由客户端完成,减少服务器压力。
2,XML文件小于XHTML文件,减少带宽。
3,有可能通过不同的XSLT文件提供不同的最终显示。
4,XSLT支持有限的编程语言功能,可以在客户端对显示进行选择和调整而不必消费服务的CPU。
5,XSLT不依赖于脚本,Cookie等功能,不受浏览器安全等级影响。

缺点有:
1,运行javascript困难。(不是不能运行)。
2,IE6.0以上对XML/XSLT支持完整。FireFox的支持不完整。
3,非常严重的问题,搜索引擎可以收录XML,但不使用XSLT,导致诸多问题。

由于以上问题,当前此项技术实际应用还比较少。知名网站中CSDN采用了此技术。我的小网站野百合资讯网在线工具网采用了这个技术.
一般多采取在服务器端将XML转化为XHTML,再返回给用户。
>>查看全文...

XSLT里的函数循环,loop in xslt

XSLT没有提循环功能,但可以通xsl:call-template递归调用来模拟循环功能。示例:

<xsl:template name="loopfunc">

<xsl:param name="start"/>

<xsl:param name="end"/>



.......



<xsl:if test="$start &lt; $end">

<xsl:call-template name="loopfunc">

<xsl:with-param name="start"><xsl:value-of select="$start+1"/></xsl:with-param>

<xsl:with-param name="end" ><xsl:value-of select="$end"/></xsl:with-param>

</xsl:call-template>

</xsl:if>

</xsl:template>



可以看到,在这个模板结束的地方,再次调用自身,并将一个参数增加1,用于判断循环结束。
>>查看全文...

xsl:call-template,XSLT里的函数调用

Through xsl:call-template, XSLT can mimic call another template like normal programming language. and the caller can provide named parameter(s) through xsl:with-param, and the callee can declare param througn xsl:param element. the callee access these parameter(s) through a $ symbol plus the parameter's name. 



通过xsl:call-template功能,XSLT可以实现一定的函数调用功能。如下例所示,一个模板可以调用另一个模板,并提供相应的参数。被调用的模板可以使用$paramname访问参数,同时也可以访问当前处理的XML文件。

<!--the main template主叫模板-->

<xsl:template name="maintemplate"> 

...........

<xsl:call-template name="linklist">

<xsl:with-param name="start" select="1"/>

<xsl:with-param name="end" select="//totalpage"/>

</xsl:call-template> 

........

</xsl:template>







<!--a template been called被调用的模板-->

<xsl:template name="subtemplate">

<xsl:param name="start"/>

<xsl:param name="end"/>

<xsl:choose>

<xsl:when test="$start=1">

........

</xsl:when>

<xsl:otherwise> 

......

</xsl:otherwise>

</xsl:choose>

</xsl:if>

</xsl:template>


>>查看全文...

xsl:import and xsl:include的区别和应用

xsl:inculde的功能类似C语言中的include,只是一种简单地引用,转换工作仍然按原来的顺序进行。

而xsl:import则试图模仿类继承,转换将从被import的XSLT开始进行,如果多重import,则从最高处的XSLT开始。

比如可以设一个基本的XSLT文件为不同的XML/XSLT对提供基本的框架,然后在不同的XSLT里提供内容细节,有点类似模版页面,或者ASP.NET里的masterpage功能。



比如,基本框架可以是一个被各个页面import的XSLT



<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"/>

<!--主框架-->

<xsl:template match="/">

<html>

<head><title></title>

</head><body> 

.....

<xsl:apply-templates />

.....

</body></html></xsl:template>



注意这里的<xsl:apply-templates />,它指示处理器去寻找合适的template,比如与不同页面相对应的XSLT template,这样就可以输出相应的内容。
>>查看全文...

.NET平台正则表达式测试

很好用的.NET平台上的RegTester,正则表达式测试软件
点击下载

一个在线测试的网页
http://binaryworld.net/Main/Tools/RegTester.aspx

>>查看全文...

如何从服务器返回XML.(Return XML from .NET HTML Page Response)

自己就遇到过这种情况,从服务器返回XML内容后客户端不认。要从服务器端返回XML,需要注意以下几点。

1,在写入内容之前调用Response.ClearContent();清除ASP.NET自动附加的Header信息。

2,然后调用Response.ContentType = "text/xml"; 这样客户端才能将内容识别为XML。

3,还要注意文件编码,一般用UTF-8比较方便。

.NET server response HTML to user as default, but you can response XML text.
to do so:

1, call Response.ClearContent(); to clear any auto-add header information by ASP.NET.

2, call Response.ContentType="text/xml"; this make our client know, this is XML;

3, use UTF-8 codepage. this is default XML codepage, espesically for east-asia lanuage.
>>查看全文...

VS2008版webdeployment project setup下载和使用

用过2005版的都知道,这个是必用的好东西。2008要装新的,MS的下载页面是
http://www.microsoft.com/downloads/details.aspx?FamilyID=0aa30ae8-c73b-4bdd-bb1b-fe697256c459&displaylang=en
约350KB。

替代下载

作用:这个软件可以集成到VS.NET中,将全部代码集中到一个DLL文件中,可以提高速度,方便发布。

注意:如果整个工程中有重复的类名,会编译失败。


使用介绍:
安装后在“生成(Build)”和WEB项目的上下文菜单看到“Add Web Deployment Project…”,好了添加一个Web Deployment Project项目,起一个名称,这个名称就是将来编译后生成的程序集名称,默认的名称“当前项目名称_deploy”

双击Web Deployment Project的项目出现属性页面

Compilation中的Output Folder设置项目输出路径
Output Assemblies中的四大选项:
Merge all outputs to a single assembly-所有输出都编译成一个程序集(参数:程序集名称)
Treat as library component (remove the App_Code.compiled file)-App_Code视为类库(删除App_Code.compiled文件)
Merge each individual folder output to its own assembly-WEB项目中单独的目录会编译到一个程序集中(参数:程序集前缀)
Merge all pages and control outputs to a single assembly-所有页面控件编译到一个程序集中(参数:程序集名称)
Create a separate assembly for each page and control output-为每一个页面和控件创建程序集

Signing使用key文件建立强命名空间的程序集

Deployment
Enable Web.config file section replacement-用不同的config文件替换Web.config中的节点
Create an IIS virtual directory for the output folder-创建IIS虚拟目录(参数:虚拟目录名称)
Remove the App_Data folder from output location-删除输出目录中的App_Data目录
>>查看全文...

.NET修改FCKEditior源代码控制附件上传

最近研究了一下FCKEditor自带的上传功能,对源代码作了一点修改,也是依照开源软件的要求,在网上共享一下。

1,安装

除了一般的那个压缩包外,ASP.NET版的FCKeditor另有一个FCKeditor.Net下载包,里面有一个Visual Studio的Solution,bin/Release里有一个FredCK.FCKeditorV2.dll文件,可以直接COPY到你的ASP.NET项目的bin文件夹里。

2,附件上传流程
FCKeditor通过在编辑界面点击Link或图片按钮打开一个模态对话框,在里面选择本地文件后上传。

这个对话框是Fckeditor/editor/dialog/fck_image.html或fck_link.html。

对话框的js代码在fck_image和fck_link目录里,它们还会调用common/fck_dialog_common.js

上面这些是客户端的事。

在Fckeditor/editor/filemanager/upload/aspx下有一个孤独的upload.aspx,link和image的上传都是通过它走的。

upload.cs里面除了注释外只有一句话,它的code behind 的代码是在前面那个ASP.NET下载包里的Uploader.cs,已经被编译进FredCK.FCKeditorV2.dll了。

3.修改Uploader.cs

3.1 把upload.aspx上唯一的那行代码修改一下。

原版:<%@ page autoeventwireup="false" inherits="FredCK.FCKeditorV2.Uploader" language="c#" %>

修改为:<% @ page autoeventwireup="false" codefile="upload.aspx.cs" inherits="FCKUpload" language="c#" %>

这样,upload.aspx就不再去FredCK.FCKeditorV2.dll寻找自己的behind code,而是在自己身边找.


3.2 从FCKeditor.Net压缩包里提取出Uploader.cs,放在自己的ASP.NET项目的FCKeditor目录里和upload.aspx放在一起。这样,Uploader.cs就成了你的项目中的一部分,完全在你的控制之下。

打开Uploader.cs,里面代码并不复杂。

首先,Uploader.cs里定义的页面类的类名要和upload.aspx的一致,这里我用的是FCKUpload.

然后加上自己的身份验证。
然后,HttpPostedFile oFile = Request.Files["NewFile"];,获得上传文件,FCKeditor的客户应当是一次只上传一个,不必考虑多个同时上传的情况。

获得文件大小,oFile.ContentLength。
获得文件名,HttpContext.Current.Request.Files[0].FileName,
要检查后缀的话,System.IO.Path.GetExtension(FileName);

保存起来,oFile.SaveAs(sFilePath);文件名和路径完全在你的控制中。

最后通过SendResults把错误代码发回去,如果上传成功,可以发0,然后是文件名和文件URL。

3.3客户端
如果有兴趣,可以研究修改一下客户端的那些JS。

4.部署新的dll

注意,不修改dll文件也一样可以使用,新加的代码在用户dll里,所以这一步并非必须。

解压缩FCKeditor.Net压缩包,打开里面的Solution,删掉Uploader.cs,重新编译FredCK.FCKeditorV2.dll,新的dll会小一点,在我这儿是从36K变成32K。(注意要编译成Release版)。

最后用新的dll替换自己项目里的老的dll。



>>查看全文...

.NET如何判断文本文件编码

文本文件里是没有存放该文本的编码方式的,需要判断文件流的前三个字节来判断编码。
通常,当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字
符集的哪种编码保存的。软件有几种途径来决定文本的字符集和编码,
最标准的途径是检测文本最开头的几个字节,楼主可以以不同编码保存后研究一下各种格式看看.比如

开头字节 Charset/encoding

EF BB BF UTF-8

FE FF UTF-16/UCS-2, little endian

FF FE UTF-16/UCS-2, big endian

FF FE 00 00 UTF-32/UCS-4, little endian.

00 00 FE FF UTF-32/UCS-4, big-endian.


在.NET里可以使用
StreamReader sr = new StreamReader("filepath", true/*detectEncodingFromByteOrderMarks*/)。//这里的true表示由程序自动判断文件编码

sr.CurrentEncoding //返回编码



>>查看全文...