网站开发

asp.net
随笔 - 30, 文章 - 0, 评论 - 9, 引用 - 0
数据加载中……

怎样向xml文档插入HTML标记

CDATA 区段
       因为网页中要显示HTML的源代码。而在XML中,要实现这样的功能,就必须使用CDATA标记。在CDATA标记中的信息被解析器原封不动地传给应用程序,并且不解析该段信息中的任何控制标记。CDATA区域是由:![CDATA[”为开始标记,以“]]为结束标记。例如:例2中的源码,除了![CDATA[”“]]符号,其余的内容解析器将原封不动地交给下游的应用程序,即使CDATA区域中的开始和结尾的空白以及换行字符等,都同样会被转交(注意CDATA是大写的字符)。 

    如同你在第三章中学到的,你不能直接将(<)或(&)符号放置在元素内容中的字符数据里。要避开这个限制的一种方法是使用字符参照(& #60;或& #38;)或预先定义的普通实体参照(& lt;或& amp;),如同你在第六章中将学到的。然而,如果你需要加入多个(<)或(&)字符,使用这些参照将变得不合适且会让资料变得难以阅读。在这种情况下,将包含限制字符的文字放置在CDATA 区段中将会比较容易完成工作。
    CDATA 区段的类型
    CDATA 区段以字符「<![CDATA[」开始,并以「]]>」字符结束。在这两个定义符号之间,你可以输入任何字符(包括「<」或「&」),除了「]]>」之外。(因为,该字符会被解释成CDATA区段的结束。)所有位在CDATA 区段中的字符都被视为元素字符数据的字义 (literal) 部分,而不是XML 标签。
    下面是一个合法CDATA 区段的范例:
<![CDATA [
Here you can type any characters except two right brackets followed
by a greater-than symbol.
]]>
注意
    关键词CDATA,就像其它你所见到的XML 关键词,必须以大写字母撰写。
    如果你想包含一段原始码或标签当作被显示在浏览器中元素的真实字符数据的一部份,你可以使用CDATA 区段来防止XML 解析器将「<」或「&」字符解释成XML 卷标。下面就是一个范例:
<A-SECTION>
The following is an example of a very simple HTML page:
<![CDATA[
<HTML>
<HEAD>
<T99vLE>R.Jones &Sons</T99vLE>
</HEAD>
<BODY>
<P>Welcome to our home page!</P>
</BODY>
</HTML>
]]>
</A-SECTION>
    例如,若没有CDATA 区段,处理器会假设<HTML>是套迭的元素的起始部分,而不是A-SECTION 元素的字符数据的起始部分。
注意
    既然你可以直接将「<」与「&」字符加入CDATA 区段中,你就不必使用字符参照(& #60;与&)或预先定义的普通实体参照(& lt;与& amp;),笔者将在第六章中解释字符参照与实体参照。事实上,如果你使用这类的参照,解析器会将参照中的每个字符照字面解释,且不会更换掉含有「<」或「&」字符的参照。
    你可以放置CDATA 区段的地方
    你可以将CDATA 区段放置在字符数据可以出现的任何地方-也就是说,在元素的内容中却不在XML 标签中。下面是一个合法放置CDATA 区段的范例
<?xml version="1.0"?>
<MUSICAL>
<T99vLE_PAGE>

 

<![CDATA[
<Oklahoma!>
By
Rogers &Hammerstein
]]>
</T99vLE_PAGE>
<!--Other elements here...-->
</MUSICAL>
    显示于下页的错误型式XML 文件包含了两个违法的CDATA 区段。第一个不是在元素的内容中。第二个则是位在文件元素的内容之中,但却不是在起始标签中。
<?xml version="1.0"?>
<![CDATA[ ILLEGAL::not within element content!]]>
<DOC_ELEMENT>
<SUB_ELEMENT <![CDATA[ ILLEGAL::inside of markup!]]>>
sub-element content...
</SUB_ELEMENT>
</DOC_ELEMENT>
注意
    CDATA 区段不能成巢状套迭。亦即,你不能将一个CDATA 区段放到另一个区段中。

posted @ 2007-04-29 17:42 风雨兼程 阅读(1835) | 评论 (0)编辑 收藏

三 生 三 世

前生,你以绯红的思念,偎依我的窗前,将一生的爱恋开放成桃花一片。

    你深情的伫立在早春三月,以灿烂温暖我冬季曾经冰封的心河。你将铮铮的誓言,以千枝万条缠绕在我的窗前,你将依恋深锁在每一朵花心,呈以幽香亲吻我的气息。

    隔窗,是我纤纤的倩影,以一双翦水的眼眸将你一片迷醉的桃红粉成痴痴的凝望。在微风细雨里,你致以我呢喃的细语,那雨滴落在花瓣上的颤音是你为我谱写的相思曲。懵懂的我,总是凭窗而立,期待一袭青衫从幽香袅绕的花树下,以热切的眼眸向我走来。红尘中的我,却看不穿你纠结满树的想我的情结。终究,你在属于自己季节的尾声,隔窗,用最后眷恋的眼光,在不舍与哀伤中碎落我的窗下,看着你飘零的身躯,撞入我心扉的是来得深刻而猛烈的疼痛,急促地伸出手,想接住你,在错过的瞬间,有泪从眼中滴落……。爱,总在失去的瞬间才知道它的存在。含泪,我祈祷来生也盛开成一簇桃花,与你临风偎依,还你一生的情。 
  
    前生,我是桃花一片,以最美的姿色开满你路过的青石小径,将一生的眷恋开放成寂寞的等待。等你潇洒的身影路过时,轻抚我的脸庞,给我一声爱怜的赞叹,我以香为魂,伴你在花丛中留恋,听你为我赋诗,为我吹笛。当你每次转身离去时,我在微风中心碎的声音,你是否听见?总在无你的夜晚独自浴着冷月的清辉想你,思念便凋落成满地憔悴的容颜,清晨,花瓣上的露珠便是我为你流了一夜的泪。 

   我寂寞而又充满期待地等着你经过,贪恋地呼吸着有你的空气,眷恋着你身上发出来的味道,有一种依偎的感觉和莫名的幸福。虽然我不能表达对你的所有的爱恋,只能无语地看着你来去匆忙的身影,你为我的每次驻足和停留,都让我感动和欣喜万分,你的忧郁的长叹总牵动我的心弦,在你看不见里为你暗自落泪。如果可以,我多么希望就这样在这里静默地守侯,守侯朝来暮去的时光里有你的身影陪伴,与你偕老。

   我只有一季短暂的生命和一颗爱你的心,在不属于我的季节即将来临之际,我将离去。虽然我有深深的眷恋和离别的伤痛,可是,生命不容我为你停留。就让我在季节最后的晨光里,以飞舞的姿势婆娑而落,在你呜咽的笛音里慢慢凋零在你的指尖……。我祈祷来生不再为花,许我能语言可以向你倾诉。

   今生,我是桃树下画花的女子,就着一袭白色长裙,拈一朵桃花簪入发,染几笔丹青,将你我的姻缘写进花瓣,等着能解花语的你飘然而来,执我之手,与我倾诉,共我缱绻。

   不许愿来世相见,不求一生拥有,只愿今生有缘能与你携手相拥,走过一段人生。我以三生的情,换你一生的缘,只是不愿再错过生命中的一段情缘。

posted @ 2007-02-26 14:05 风雨兼程 阅读(183) | 评论 (0)编辑 收藏

一个关于模态弹出窗口刷新父窗体的问题。急

问:
我在做一套系统的时候碰到这样一个问题。
弹出的模态窗口不能刷新父窗体。例如我新增数据是在模态窗口而添加成功了关闭后父窗体只能手动刷新。这样就严重影响了一些效果。
我尝试过一些方法但是始终不对。请各位高手进来一下。

用OPEN打开的不管是在关闭窗体时自动刷新都没有任何问题。见下例

父窗体代码
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title></title>
</head>
<body>
<a href="javascript:void(0)" onclick="window.open('2.html','','')">open</a>
</body>
</html>

子窗体代码
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title></title>
</head>
<body onUnload="opener.location.reload()">
<!-
用按纽直接刷新父窗体
<a href="javascript:opener.location.reload()">刷新</a>
->
</body>
</html>

 

换做模态后的程序。
父窗体代码
<%@ page contentType="text/html; charset=GBK" %><HEAD>
<body onUnload="opener.location.reload()">
<script language="JavaScript">
function showabout()
{
  var returnValue=showModalDialog('2.html','','dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');

void(0);
</script>
<a href="javascript:void(0)" onClick="showabout()">open</a>

子窗体代码
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title></title>
</head>
<body onUnload="opener.location.reload()">
<a href="javascript:opener.location.reload()">刷新</a>
</body>
</html>

 

请各位参考一下上面的代码,我感觉错误好象是出在
opener.location.reload()

谢谢
______________________________________________________________________________________________
答1:
模态窗口不能在子窗口中直接刷新父窗口

父窗体代码
<%@ page contentType="text/html; charset=GBK" %><HEAD>
<body onUnload="opener.location.reload()">
<script language="JavaScript">
function showabout()
{
  var returnValue=showModalDialog('2.html','','dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');
  location.reload()//模态窗口传值下来后就可以刷新了.

void(0);
</script>
<a href="javascript:void(0)" onClick="showabout()">open</a>

子窗体代码
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title></title>
</head>
<body onUnload="opener.location.reload()">
<a href="javascript:opener.location.reload()">刷新</a>//???在子窗口中不能刷新父窗口,只有window.close下去后才可刷新.
</body>
</html>

______________________________________________________________________________________________
答2:
模态对话框是不能用opener引用父窗口的,而是需要父窗口主动传递指针变量的
这个window.showModalDialog有第二个参数,就是做这个用的,你需要把window穿过去,就是这样
var returnValue=showModalDialog('2.html',window,'dialogWidth:520px;dialogHeight:510px;help:no;center:yes;resizable:no;status:no;scroll:no');
这样在对话框中就可以引用父窗口对象,怎么引用呢,通过window.dialogArgument就可以应用父窗口了。

______________________________________________________________________________________________
答3:
谢谢。我终于搞定了。
上面的dialogArgument差个S
我调了半天。发现在body里面应该加上location
也就是<body onUnload="window.dialogArguments.location.reload()">

posted @ 2007-02-09 14:48 风雨兼程 阅读(5854) | 评论 (4)编辑 收藏

asp.net中动态变更CSS

在asp.net中,有的时候要动态变换CSS,比如有的时候做个性化页面,可以这样做
<head>
<link id="MyStyleSheet" rel="stylesheet" type="text/css" runat="server" />
</head>
之后,在要更换CSS的页面中,使用如下代码
Sub Page_Load(Sender As Object, E As EventArgs)
If Not (IsPostBack)
MyStyleSheet.Attributes.Add("href","/css/flostyle.css")
End If
End Sub  

posted @ 2007-02-09 13:09 风雨兼程 阅读(218) | 评论 (0)编辑 收藏

动态改变Asp.net页面标题

1.引用命字空间
use System.Web.UI.HtmlControls.HtmlGenericControl
在Asp.net 中你可以使用HtmlGenericControl()来动态改变页面Title(标题)



2.为HTML Title标签设置ID,并将其作为服务器端运行
<HTML>
  <HEAD>
    <TITLE ID=MyPageTitle Runat=Server> </TITLE>
  </HEAD>
 <BODY>
  </BODY>
</HTML>



3.将Title标设设为Runat=server后,就可以后台代码进行访问~~,通过InnerText或InnerHtml
来改变其值.
public class Use_This : System.Web.UI.Page
 {
  
Private System.Web.UI.HtmlControls.HtmlGenericControl SetMyTitle;
  private void Page_Load(object sender, System.EventArgs e)
  {

   SetMyTitle.InnerText = "~哈哈~";

  }
}


posted @ 2007-02-09 13:08 风雨兼程 阅读(394) | 评论 (1)编辑 收藏

怎样实现动态添加删除表单中的行

<script LANGUAGE="JAVASCRIPT">
var i= 0;
var a = 0;
function insertRow(){
 var otr=myTable.insertRow(myTable.rows.length);
 var ocell=otr.insertCell(0);
 ocell.innerHTML="<input type=file name='f1'+a+''>"
 var ocell=otr.insertCell(1);
   ocell.innerHTML="<input type=file name='f2'+a+''>"
   var ocell=otr.insertCell(2);
   ocell.innerHTML="<input type=button name='del'+a+'' value=删除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)>"
   i++;
   a++;
}
</SCRIPT>
</HEAD>
<BODY>
<table id="myTable" border=1 width=600 >
</table>
<input type=button onclick="insertRow()"  value="插入行">
</BODY>

2
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>添加删除行</title>
</head>

<body><script LANGUAGE="JAVASCRIPT">
var j= 1;
var i= 0;
var a = 0;
function insertRow(){
 var otr=myTable.insertRow(myTable.rows.length);
     var ocell=otr.insertCell(0);                                         
  ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text  size='12' maxlength='7'name='num"+a+"'>"
     var ocell=otr.insertCell(1);
   ocell.innerHTML="<select name='adsl"+a+"'><option value='1'>ADSL</option><option value='2'> LAN</option></select>"
      var ocell=otr.insertCell(2);                                         
   ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'value='"+j+"'>"
      var ocell=otr.insertCell(3);                                         
   ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
      var ocell=otr.insertCell(4);                                         
   ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
      var ocell=otr.insertCell(5); 
   ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"     
     var  ocell=otr.insertCell(6);
   ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=button name='del'+a+'' value=删除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)>"
   j++;
   i++;
   a++;
}
</SCRIPT>
</HEAD>
<BODY>
<table id="myTable"width="778" border="1" align="center" cellspacing="0" bordercolorlight="#66CC33" bordercolordark="ffffff">
  <tr>
    <td><div align="center">号码</div></td>
    <td nowrap><div align="center">宽度类型</div></td>
    <td nowrap><div align="center">起始时间</div></td>
    <td nowrap><div align="center">优惠时间</div></td>
    <td nowrap><div align="center">优惠金额</div></td>
    <td nowrap><div align="center">备注</div></td>
    <td nowrap><div align="center">删除</div></td>
  </tr>
</table>
<p align="center">
  <input type=button onclick="insertRow()"value="插入行">
</p>

<p>&nbsp;</p>
</BODY>

</body>
</html>

3
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>添加删除行</title>
</head>

<body><script LANGUAGE="JAVASCRIPT">
var i= 0;
var a = 0;
function insertRow(){
 var otr=myTable.insertRow(myTable.rows.length);
     var ocell=otr.insertCell(0);                                         
  ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text  size='12' maxlength='7'name='num"+a+"'>"
     var ocell=otr.insertCell(1);
   ocell.innerHTML="<select onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'name='adsl"+a+"'><option value='1'>ADSL</option><option value='2'> LAN</option></select>"
      var ocell=otr.insertCell(2);                                         
   ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'value='"+a+"'>"
      var ocell=otr.insertCell(3);                                         
   ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
      var ocell=otr.insertCell(4);                                         
   ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"
      var ocell=otr.insertCell(5); 
   ocell.innerHTML="<input onkeydown='if(event.keyCode==13){event.keyCode=9;return true}'type=text size='20'name='aa"+a+"'>"     
     var  ocell=otr.insertCell(6);
   ocell.innerHTML="<input type=button name='del'+a+'' value=删除 onclick=myTable.deleteRow(event.srcElement.parentElement.parentElement.rowIndex)>"

   i++;
   a++;
}
function deleteRow()
{
   tr=document.getElementById("myTable").rows;
   if(tr.length>1)tr[tr.length-1].removeNode();
}
</SCRIPT>
</HEAD>
<BODY>
<table id="myTable"width="778" border="1" align="center" cellspacing="0" bordercolorlight="#66CC33" bordercolordark="ffffff">
  <tr>
    <td><div align="center">号码</div></td>
    <td nowrap><div align="center">宽度类型</div></td>
    <td nowrap><div align="center">起始时间</div></td>
    <td nowrap><div align="center">优惠时间</div></td>
    <td nowrap><div align="center">优惠金额</div></td>
    <td nowrap><div align="center">备注</div></td>
    <td nowrap><div align="center">删除</div></td>
  </tr>
</table>
<p align="center">
  <input type=button onclick="insertRow()"value="插入行">
  <input type=button onclick="deleteRow()"value="删除行">
</p>

<p>&nbsp;</p>
</BODY>

</body>
</html>

posted @ 2007-01-29 18:58 风雨兼程 阅读(1211) | 评论 (0)编辑 收藏

文件上传

 function OutputUpload(id,title) { var tblMain=document.getElementById("Table2"); var tbl=document.getElementById("Table3"); var isExsitfile=document.getElementById("file"+id); var text=document.createTextNode("上传:"+title+"虚拟形象图片"); if(isExsitfile==null) { var str= ""; tbl.rows[id].cells[0].insertAdjacentHTML("beforeEnd",str) ; tbl.rows[id].cells[0].appendChild(text); } else { tbl.rows[id].cells[0].removeChild(isExsitfile); tbl.rows[id].cells[0].innerText=""; } }

if(Request.Form["CHK"]!=null)
   {   string chkvalue=Request.Form["CHK"].ToString();
    string[] mylayer=chkvalue.Split(new char[]{','});
    string layer="";
    for(int i=0;i<mylayer.Length;i++)
    {     
     
     if(layer!="")
     {
      layer+="_";
     }
     layer+=mylayer[i];
     
    }
    ViewState["layer"]=layer;
      
    //得到数据库编号
    if(itemid1.ToString()==null)
    {
     itemid1=itemid1+1;
    }
    else
    {
     itemid1=GetItemID()+1;
    }
    System.Web.HttpFileCollection files=System.Web.HttpContext.Current.Request.Files;
    try
    {
     for(int i=0;i<files.Count;i++)
     {  
      string fid=itemid1+".gif";
      HttpPostedFile postedFile=files[i];
      
      if(postedFile.FileName.Length>0)
      {
       string fileName,fileExtension;
       fileName=System.IO.Path.GetFileName(postedFile.FileName);
       fileExtension=System.IO.Path.GetExtension(fileName);

       if(fileExtension!=GlobalVars.FILETAILNAME[0])
       {
        Response.Write("<script>alert(\"文件格式不正确!!!\")</script>");
        return;
       }
       if(i==0)
       {
        //上传图片到服务器上  
        BLL.Visual_Items bll=new BLL.Visual_Items();
        bool tf=bll.Exists(this.txtName.Text);
        if(tf==false)
        {  
         if(System.IO.Directory.Exists(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0"))
         {
          postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0\\" + fid); 
         }
         else
         {
          System.IO.Directory.CreateDirectory(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0");
          postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\0\\" + fid); 
         }
         // 把图片的信息记录保留到数据库中
         string s="images/img_Visual/show/0/"+fid;
         AddData(s,itemid1,layer);

        }
        else
        {
         this.Response.Write("<script>alert('数据库已存在此条数据!')</script>");
        }

       }
       else
       {
        if(System.IO.Directory.Exists(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]))
        {
         postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]+"\\" + fid);
        }
        else
        {
         System.IO.Directory.CreateDirectory(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]);
         postedFile.SaveAs(Server.MapPath(Request.ApplicationPath) + "\\images\\img_Visual\\show\\"+mylayer[i-1]+"\\" + fid);

        }
       }
      }
      else
      {
       Response.Write("<script>alert(\"虚拟形象图片不能为空!\")</script>");
       return ;

      }
     } 
    }
    catch(Exception ex)
    {
     string sRawURL = Request.RawUrl;

     if(sRawURL.IndexOf("?") > -1)
     {
      sRawURL = sRawURL.Substring(0,sRawURL.IndexOf("?"));
     }    
     
     Response.Write(ex.ToString());
    } 
   }
   else
   {
               Response.Write("<script>alert(\"请选择虚拟形象所属层!!\")</script>");
   }

posted @ 2006-12-16 11:31 风雨兼程 阅读(234) | 评论 (0)编辑 收藏

2006年it人士必去的10个网站

1、chinaunix
网址:http://www.chinaunix.net/
简介:中国最大的linux/unix技术社区。

2、itpub
网址:http://www.itpub.net/
简介:有名气的IT技术论坛,看看它的alexa排名就知道有多火了,尤其以数据库技术讨论热烈而闻名。ITPUB论坛的前身是建立在smiling的oracle小组。

3、51cto
网址:http://www.51cto.com/
简介:由国内知名IT门户网站管理团队,获近千万风险投资,于2005年8月正式创立,是国内首家定位于网络技术人员的综合性服务平台,是中国最大的网络技术网站。

4、csdn
网址:http://www.csdn.net/
简介:于1999年3月成立,是中国最大的软件开发人员网站,社区热心高手众多,并有不少MVP(微软最有价值专家)长期活跃在这里,类似悬赏的积分制度,也使论坛增添不少乐趣。

5、落伍者
网址:http://www.im286.com/
简介:网站站长都应该知道的地方,只是论坛id需要手工审核。

6、蓝色理想
网址:http://www.blueidea.com/
简介:有名的关于网站设计的网站,拥有大量忠实网友。

7、it写作社区
网址:http://www.donews.com/
简介:一个可以让你的思维活跃起来的地方,在这里it评论人和撰稿人可以找到很多的文字素材。

8、博客堂
网址:http://blog.joycode.com/
简介:众多MVP交流的地方,这里有各类最新技术,只是网站成员采用邀请制,不提供注册或者申请功能。

9、it英雄榜
网址:http://www.itheroes.cn/
简介:网站以介绍it界人士为主,广大从事it的人员可以从中获取他们的经验。

10、邪恶八进制
网址:http://www.eviloctal.com/
简介:目前为数不多的一个讨论气氛浓厚,技术水平高的网络安全网站,邪恶八进制信息安全团队也是一个管理规范、人员素质高的网络安全小组。

posted @ 2006-11-08 15:14 风雨兼程 阅读(230) | 评论 (0)编辑 收藏

ASP.NET应用中十大常见的潜在问题

Jeff Prosise在《MSDN杂志》2006年7月期上的文章历数ASP.NET应用中常见的,容易出错,影响性能和扩缩性的潜在问题

Keep Sites Running Smoothly By Avoiding These 10 Common ASP.NET Pitfalls
http://msdn.microsoft.com/msdnmag/issues/06/07/WebAppFollies/

1。设置输出缓存的用户控件,如果用LoadControl动态装载,LoadControl返回对象属于PartialCachingControl类,其中的CachedControl也许并不存在,无法转换成原用户控件对象类

2。在 IIS 6.0 中,在设置kernel模式输出缓存的情形下,OutputCacheModule模块有时会保留缓存输出的Set-Cookie header,导致会话串门(cross-session),即一个用户能看到其他用户的会话数据

具体参考KB文章
An ASP.NET page is stored in the HTTP.sys kernel cache in IIS 6.0 when the ASP.NET page generates an HTTP header that contains a Set-Cookie response
http://support.microsoft.com/kb/917072

或者禁止kernel模式输出缓存
<httpRuntime enableKernelOutputCache="false" />

具体参考
http://support.microsoft.com/kb/820129

3。 Forms 认证Ticket的存活时间。在ASP.NET 1.*中,在没有用编码设置的情形下,如果是持久保存,存活时间是50年,如果是非持久保存,存活时间是30分钟。这个问题在ASP.NET 2.0中已经解决,默认存活时间会用web.config里的设置。在ASP.NET 1.*中,只能用编码来解决,具体编码参考原文中的例子。

4。 View State,如果滥用的话,是无声的性能杀手,特别是DataGrids和GridViews等,应该设置EnableViewState=false,或者考虑通过更改LoadPageStateFromPersistenceMedium/SavePageStateToPersistenceMedium把View State放在服务器端。

5。如果使用SQL Server做会话状态服务器的话,默认情形下,每个请求会访问状态服务器2次,造成性能下降。解决方案是,在不用会话状态的页面里,设置

<%@ Page EnableSessionState="false" ... %>

在只读会话状态的页面里,设置

<%@ Page EnableSessionState="ReadOnly" ... %>

6。在ASP.NET 2.0应用中,如果在web.config里设置

<roleManager enabled="true" />

默认情形下,角色数据是不缓存的,如果角色管理器需要确认当前用户的角色的话,会访问数据库,导致性能下降,解决方案是设置把角色数据缓存在Cookie里(这个Cookie是加过密的)

<roleManager enabled="true" cacheRolesInCookie="true" />

7。Profile 特性持久化问题,在默认情形下,ASP.NET profile管理器使用XML持久机制持久化自定义Profile类,不保存这些类的私有成员,解决方案是把这些类标为[Serializable]或实现ISerializable ,这样profile管理器会使用binary serializer

8。过长的数据库查询或I/O操作会导致线程池的饱和,导致ASP.NET的性能下降。ASP.NET 2.0提供了异步网页(asynchronous page)机制来缓解这个问题。具体参考Jeff Prosise在《MSDN杂志》2005年10月期上的文章

Asynchronous Pages in ASP.NET 2.0
http://msdn.microsoft.com/msdnmag/issues/05/10/WickedCode/

9。<identity impersonate="true" /> 导致客户端用户的身份模拟,要慎用,避免用身份模拟(Impersonation)替代ACL授权。

10。别太有信心,多用Profiler剖析你的应用对数据库的访问情形。重视数据库的设计,认识到DataSet和DataAdapter对web应用也许并不合适,数据访问层要恰当设计,防止粗劣细分(poor factorization),避免在相对简单的操作上浪费太多的CPU周期,导致性能下降

posted @ 2006-11-07 14:08 风雨兼程 阅读(175) | 评论 (0)编辑 收藏

Asp.net动态生成html页面

此功能适用于后台数据库功能不强的web站点,即大部分文本不是存放在数据库的记录中,而是放在html文件或者xml文件中,仅仅把索引放到数据库中,如文章标题、类别、查询关键字等。这样适合于后台没有诸如MS Sql Server这样的数据库支持的Web站点。

适用于新闻发布系统,比如sina、163等都是采用动态生成html页面的。

适用于需动态定制页面的程序。比如论坛、聊天室等。可以加载定制好的html页面,来加强美观。

思路

1. 利用如Dw-Mx这样的工具生成html格式的模板,在需要添加格式的地方加入特殊标记(如$htmlformat$),动态生成文件时利用代码读取此模板,然后获得前台输入的内容,添加到此模板的标记位置中,生成新文件名后写入磁盘,写入后再向数据库中写入相关数据。

2. 使用后台代码硬编码Html文件,可以使用HtmlTextWriter类来写html文件。

优点

1. 可以建立非常复杂的页面,利用包含js文件的方法,在js文件内加入document.write()方法可以在所有页面内加入如页面头,广告等内容。

2. 静态html文件利用MS Windows2000的Index Server可以建立全文搜索引擎,利用asp.net可以以DataTable的方式得到搜索结果。而Win2000的Index服务无法查找xml文件的内容。如果包括了数据库搜索与Index索引双重查找,那么此搜索功能将非常强大。

3. 节省服务器的负荷,请求一个静态的html文件比一个aspx文件服务器资源节省许多。

缺点

思路二: 如果用硬编码的方式,工作量非常大,需要非常多的html代码。调试困难。而且使用硬编码生成的html样式无法修改,如果网站更换样式,那么必须得重新编码,给后期带来巨大的工作量。

因此这里采用的是第一种思路

示列代码

1.定义(template.htm)html模板页面

<html>

<head>

<title></title>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body >

<table $htmlformat[0] height="100%" border="0" width="100%" cellpadding="10" cellspacing="0" bgcolor="#eeeeee" style="border:1px solid #000000">

<tr>

<td width="100%" valign="middle" align="left">

<span style="color: $htmlformat[1];font-size: $htmlformat[2]">$htmlformat[3]</span>

</td>

</tr>

</table>

</body>

</html>

2.asp.net代码:

//---------------------读html模板页面到stringbuilder对象里----

string[] format=new string[4];//定义和htmlyem标记数目一致的数组

StringBuilder htmltext=new StringBuilder();

try

{

using (StreamReader sr = new StreamReader("存放模板页面的路径和页面名"))

{

String line;

while ((line = sr.ReadLine()) != null)

{

htmltext.Append(line);

}

sr.Close();

}

}

catch

{

Response.Write("<Script>alert('读取文件错误')</Script>");

}

//---------------------给标记数组赋值------------

format[0]="background=\"bg.jpg\"";//背景图片

format[1]= "#990099";//字体颜色

format[2]="150px";//字体大小

format[3]= "<marquee>生成的模板html页面</marquee>";//文字说明

//----------替换htm里的标记为你想加的内容

for(int i=0;i<4;i++)

{

htmltext.Replace("$htmlformat["+i+"]",format[i]);

}

//----------生成htm文件------------------――

try

{

using(StreamWriter sw=new StreamWriter("存放路径和页面名",false,System.Text.Encoding.GetEncoding("GB2312")))

{

sw.WriteLine(htmltext);

sw.Flush();

sw.Close();

}

}

catch

{

Response.Write ("The file could not be wirte:");

}

小结

用此方法可以方便的生成html文件。程序使用了是循环替换,因此对需替换大量元素的模板速度非常快。

posted @ 2006-11-07 14:01 风雨兼程 阅读(775) | 评论 (0)编辑 收藏

仅列出标题
共3页: 上一页 1 2 3 下一页