ASP.NET AJAX MSSQL MYSQL 技术交流区

Bullion技术交流BLOG

博客园 首页 新随笔 联系 订阅 管理

public static string GetString(string str, int length )
        {
            int i = 0, j = 0;
            foreach (char chr in str)
            {
                if ((int)chr >30)
                {
                    i += 2;
                }
                else
                {
                    i++;
                }
                if (i > length)
                {
                    str = str.Substring(0, j) + "...";
                    break;
                }
                j++;
            }
            return str;

        }
        #endregion

posted @ 2007-12-25 08:42 风语战士 阅读(11) | 评论 (0)编辑
 
 public static bool IsValidUsername(string strName, string acsii)
        {
            return (Regex.IsMatch(strName, acsii));
        }
posted @ 2007-12-25 08:39 风语战士 阅读(7) | 评论 (0)编辑
 
  int CurrentPage;//当前页数
  int PageSize;   //每页条数
  int PageCount;  //总页数
  int RecordCount;//总条数


  
  private void Page_Load(object sender, System.EventArgs e)
  {
   PageSize=16; //每页为16条记录
   if(!IsPostBack)
   {
    if(Session["ji"]==null||Session["ji"].ToString()=="")
    {
     Response.Write("<script language = javascript>window.open('Login.aspx','_top')</script>");
    }
    else
    {
    
     DataListBind();
    Page.DataBind();
    CalculateRecord();
  
 }
      }

  }

  public void LinkButton_Click(Object sender, CommandEventArgs e)//自己编写的按钮点击事件
  {
   CurrentPage =(int)ViewState["PageIndex"];//获得当前页索引
   PageCount = (int)ViewState["PageCount"];//获得总页数

   int inpage=0;
   string cmd = e.CommandName;

   //判断cmd,以判定翻页方向


   switch (cmd)
   {
    case "prev"://上一页
     if (CurrentPage > 0)CurrentPage--;
     break;

    case "next":
     if (CurrentPage < (PageCount - 1)) CurrentPage++;//下一页
     break;

    case "first"://第一页
     CurrentPage = 0;
     break;

    case "end"://最后一页
     CurrentPage = PageCount - 1;
     break;

    case "jump"://跳转到第几页
     try
     {
      inpage=int.Parse(TextBox2.Text.Trim());
                 }
     catch
     {
      Response.Write("<script>alert('只能输入数字!!!')</script>");
      return;
     }     
    if (this.TextBox2.Text.Trim()== "" || Int32.Parse(this.TextBox2.Text.Trim()) > PageCount ||Int32.Parse(this.TextBox2.Text.Trim())<0)//如果输入数字为空或超出范围则返回
     {
      return;
     }
     else
     {                   
      CurrentPage = Int32.Parse(this.TextBox2.Text.ToString()) - 1;
      break;
     }
   }
   ViewState["PageIndex"] = CurrentPage;//获得当前页

   //重新将DataList绑定到数据库
//CalculateRecord();
  DataListBind(); 

  }

  public void  CalculateRecord()
  {
              
   //不可以放在初始化条件之前就绑定,那样的话,如果仅有一页的数据,“下一页”页仍然显示
   CurrentPage = 0;//当前页习惯设为0
   ViewState["PageIndex"] = 0;//页索引也设为0


   //计算总共有多少记录
   RecordCount =com.kecount();
           
   //计算总共有多少页
   if (RecordCount % PageSize == 0)
   {
    PageCount = RecordCount / PageSize;
   }
   else
   {
    PageCount = RecordCount / PageSize + 1;
   }

   this.TotalLbl.Text = PageCount.ToString();//显示总页数
   ViewState["PageCount"] = PageCount;//会话session 对整个 application 有效 ,而视图状态 viewstate相当于某个页面的 session
   this.DataListBind();

  }
  public void DataListBind()
  {

   string zhuang="zhuang";
   int StartIndex = CurrentPage * PageSize;
   if(StartIndex<0)
   {
    StartIndex=0;
   
   }

          DataSet ds=com.kehu1(StartIndex,PageSize,zhuang);
      
   DataList1.DataSource=ds.Tables["zhuang"].DefaultView;
    
   DataList1.DataBind();
   
    this.PreviousLB.Enabled = true;
    this.NextLB.Enabled = true;
    if (CurrentPage == (PageCount - 1)) this.NextLB.Enabled = false;//当为最后一页时,下一页链接按钮不可用
    if (CurrentPage == 0) this.PreviousLB.Enabled = false;//当为第一页时,上一页按钮不可用
    this.CurrentLbl.Text = (CurrentPage + 1).ToString();//当前页数
   
  }

  private void DataList1_UpdateCommand_1(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
  {
   Response.Redirect("addkefu.aspx?type=2"+"&id="+DataList1.DataKeys[e.Item.ItemIndex].ToString());
  }

  private void DataList1_DeleteCommand_1(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
  {
   
  
             DataTable url=com.kehusele(int.Parse(DataList1.DataKeys[e.Item.ItemIndex].ToString())).Tables[0];

   ViewState["name"]=Server.MapPath("..\\kehu\\"+url.Rows[0]["name"].ToString());

   bool dele=com.delekehu(int.Parse(DataList1.DataKeys[e.Item.ItemIndex].ToString()));
   if(dele==true)
   {
    Response.Write("<script>alert('删除成功!!!')</script>");
    FileInfo finfo = new FileInfo(ViewState["name"].ToString());
    if(finfo.Exists)
    {
     finfo.Delete();
    }
   
   }
   else
   {
   Response.Write("<script>alert('删除失败!!!')</script>");
   }
   CalculateRecord();

    DataListBind();
  }

  private void DataList1_ItemDataBound_1(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
  {
   if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
   {
    
    //判断删除按扭
    Button Button2=(Button)e.Item.FindControl("Button2");
    Button2.Attributes.Add("onclick","return confirm('确定要删除吗??')");
    
   }
  }

  
  public String Imger1
  {
   
   get {return _imger1;}
  set {_imger1=value;}
}


 }
}

HTML
<td><FONT face="宋体" size="2"><asp:linkbutton id="FirstLB" runat="server" OnCommand="LinkButton_Click" CommandName="first">第一页</asp:linkbutton><asp:linkbutton id="PreviousLB" runat="server" OnCommand="LinkButton_Click" CommandName="prev">上一页</asp:linkbutton><asp:linkbutton id="NextLB" runat="server" OnCommand="LinkButton_Click" CommandName="next">下一页</asp:linkbutton><asp:linkbutton id="EndLB" runat="server" OnCommand="LinkButton_Click" CommandName="end">最后一页</asp:linkbutton>共
       <asp:label id="TotalLbl" runat="server" ForeColor="#FF8000"></asp:label>页 当前第
       <asp:label id="CurrentLbl" runat="server" ForeColor="#FF8000"></asp:label>页
       <asp:linkbutton id="JumpLB" runat="server" OnCommand="LinkButton_Click" CommandName="jump">跳到</asp:linkbutton>第
       <asp:TextBox id="TextBox2" runat="server" Width="63px"></asp:TextBox>页</FONT></td>

posted @ 2007-12-20 23:37 风语战士 阅读(73) | 评论 (0)编辑
 
输入时
public string TransString(string str)
  {
   short temp=13;
   str=str.Replace("'","’");
   str=str.Replace("&","&amp;");
   str=str.Replace("<","&lt;");
   str=str.Replace(">","&gt;");
   str=str.Replace(" ","&nbsp;");
   str=str.Replace(((char)temp).ToString(),"<br>");
   return str;
  }
读取时.
  public string BackTransString(string str)
  {
   short temp=13;
   str=str.Replace("’","'");
   str=str.Replace("&amp;","&");
   str=str.Replace("&lt;","<");
   str=str.Replace("&gt;",">");
   str=str.Replace("&nbsp;"," ");
   str=str.Replace("<br>",((char)temp).ToString());
   return str;
  }
posted @ 2007-12-20 20:34 风语战士 阅读(14) | 评论 (0)编辑
 

 <PARAM NAME="WMode" VALUE="Transparent">  加入这个属性就可以显示出来了.

posted @ 2007-12-19 11:38 风语战士 阅读(9) | 评论 (0)编辑
 

DataGrid1_DeleteCommand 写在这里
if(this.DataGrid1.PageCount==1)
    {
     DataGrid1.CurrentPageIndex=0;
    }
    else if(this.DataGrid1.Items.Count%25==1)
    {
    DataGrid1.CurrentPageIndex--;
    }

25 为变量,每一页的条数.
PageCount 总页数
CurrentPageIndex 显示当前页的索引
DataGrid1.Items.Count 获取总条数


DataGrid1_ItemDataBound 写在这里 在删除前判断是否删除
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem)
   {
       LinkButton link=(LinkButton)e.Item.FindControl("LinkButton1");
    link.Attributes.Add("onclick","return confirm('您是否要删除此条记录!!!');");
             }
FindControl 获取引用控件的ID
LinkButton 变量,也可以是Button

Button2.Attributes.Add("onclick","return confirm('确定要修改您信息吗???');");

posted @ 2007-12-19 11:10 风语战士 阅读(10) | 评论 (0)编辑
 
Response.Write("<script language = javascript>window.open('Login.aspx','_top')</script>");
posted @ 2007-12-19 11:03 风语战士 阅读(7) | 评论 (0)编辑
 

1.检测到有潜在危险的 Request.Form 值

原因:

(1)在提交数据的页面或webconfig中没有对validateRequest的属性进行正确的设置

(2)HTML里面写了两个<form>引起

解决:
方案一: 在.aspx文件头中加入这句: <%@ Page validateRequest="false"  %>
方案二: 修改web.config文件:
 <configuration>
  <system.web>
  <pages validateRequest="false" />
  </system.web>
  </configuration>
因为validateRequest默认值为true。只要设为false即可。

2.“在没有任何数据时进行无效的读取尝试”解决办法

原因:
所返回的sqldatareader无数据记录,但没有作记录判断力处理。返回的是空值

加上判断即可: if (reader.read()) { TextName.Text =
reader["FieldName"].ToString(); }


3.数据为空。不能对空值调用此方法或属性。

原因:
若对象是null,那么调用对象的方法例如ToString()肯定出错一般是数据库字段的值为空
在grideview等数据控件常出现

解决:因此建议作NULL处理

4.阅读器关闭时 FieldCount 的尝试无效

原因:
使用了SqlDataReader来绑定数据后,将connection对象作了Close()处理
类似
public SqlDataReader   GetSomething()
{  
conn.open(); 
 SqlDataReader   reader =
sqlcmd.ExcecutReader(CommandBehavior.CloseConnection)); 
 conn.close();// occur error   here  
 return   reader;  
 }
在绑定的时候调用了这个方法来指定数据源。如果使用这个方法则需要在调用函数中关闭Re
ader这样conn就可以自动关闭。

如果是使用的是SqlDataAdapter和DataSet那么请去掉显式关闭conn的调用。或者在finally
中调用之。

5.未能映射路径

原因:可能是在webconfig中的路径配置不正确所致

<add key="FCKeditor:BasePath" value="~/admin/fckeditor/"/>

<add key="FCKeditor:UserFilesPath" value="/UserFiles/" />

6.Unreachable code detected

 原因:
 一般是在异常处理理或返回值时使用了 throw 或return ,可能是其位置放在前面,造成后面的代码执行到了。

解决:
 把相关的异常抛出处理的语句(throw)或return 的语句放到代理执行的最后一行。


 7.索引超出范围。必须为非负值并小于集合大小

 原因:
 (1).没有设置DATAKEYFIELD设为数据库中相对应的唯一字段(一般是主键)
 
 (2).DataGrid1.Columns > e.Item.Cells

解决:
(1).设置datakeyfield

(2).加入判断语句datagrid1.item.count (datagrid可以是其它相类似的服务器控件)

8数据为空。不能对空值调用此方法或属性


9数据源不支持服务器端的数据分页。

解决方法:
不要使用DataReader,改成使用DataSet:或使用自定义分页形式,不采用vs.net提供的分页功能

        OleDbDataAdapter da = new OleDbDataAdapter(sql, connection);
        DataSet ds2 = new DataSet();
        da.Fill(ds2, "News");

        GridView1.DataSource = ds2;
        GridView1.DataBind();


10.对象名'***** '无效

原因:当前使用的数据库中没有*****这张表

解决: 查看是否程序中是否写错了所调用的表的名称或看一下SQL数据库中是否存在你所调用的表


11.在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL
  Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序,
  error: 40 - 无法打开到 SQL Server 的连接)

solution: 主机上需要用固定的IP地址或服务器地址

12.SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM
之间。


出现这种问题``多半是因为你更新数据库时``datetime字段值为空``默认插入0001年01月01
日``造成datetime类型溢出


13.出现-------表示“属性”,此处应为“方法”

原因: 1.VB与c#的方法,属性的格式有所不一样导致。
2.可能是在design中绑定数据的语法出现错误 解决: 1.记住属性用[] 方法用()
2.记住绑定数据的正确语法(有以下几种方式::<%Container.DataItem(“字段名”)%> <%
#Eval(“字段名”)%> <%Bind(“字段名”)%>等)

 

14.未能从程序集“DAL, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null”中加载类型“DAL.SqlHelper”。

原因:修改了其他层后未能重新编译成dll

解决:编译一下(Rebuild)

15.为过程或函数 指定的参数太多,

solution:调用存储过程与定义的存储过程所用的参数数量或所执行的SQL语句中所传入的参
数个数不一致(这是个SQL的错误)
解决方案:仔细检查在存储过程中所设定的参数变量,与实际输入的参数值是否一一对应


16.无法启动调试,绑定句柄无效

原因:系统的Terminal   Services没有开启


17.Unable to debugging on the web server.Debug failed  because integrated windows authentication is not enable

解决方法:

打开vs2005->工具(Tools)->选项(Option)->调试(debugging)->编辑并继续(Edit and Continue)->全部打勾


18.Automation 操作中文件名或类名未找到: 'RegExp'

解决方法:regsvr32 vbscript.dll


19.System.NullReferenceException: 未将对象引用设置到对象的实例。

原因:

(1)所设置的变量为空值或没有取到值,一般出现在传递参数的时候出现这个问题,也会在使用datagrid或gridview或datalist等数据控件时出现.

(2)控件名称与codebehind里面的没有对应

(3)未用new初始化对象

(4)在程序中所引用的控件不存在

解决方法:
(1)使用try..catch...finally捕捉错误,或直接用response.write()输出所取的变量值

(2)查看代码中是否存在未初始化的变量

20.错误 1718。文件被数字签名策略拒绝(安装vs2005sp1时)
解决方法:

(1). 单击“开始”,单击“运行”,键入 control admintools,然后单击“确定”。
(2). 双击“本地安全策略”。
(3). 单击“软件限制策略”。(注意:如果未列出软件限制,请右击“软件限制策略”,然后单击“新建策略”。 )
(4). 在“对象类型”下,双击“强制”。
(5). 单击“除本地管理员以外的所有用户”,然后单击“确定”。
(6). 重新启动计算机。

微软说明:
http://support.microsoft.com/kb/925336

21.vs2005不能从源文件模式切换到视图模式

解决方法:dos下运行下 devenv /resetskippkgs (win+r cmd)

22.Validation of viewstate MAC failed
解决办法:页面的顶部page加 EnableViewState="False" EnableViewStateMac = "False" 来解决这个问题

23.Automation server can't create object"(Automation 服务器不能创建对)

解决办法:运行: Regsvr32 scrrun.dll 即可。

24.包加载失败

未能正确加载包"Visual Web Developer Trident Designer Package"(GUID =

{30AE7E28-6C02-496D-8E43-85F7A90AEFF1}。

解决方法:
1、设置系统变量 VsLogActivity=1

2、在%APPDATA%\Microsoft\VisualStudio\8.0\文件夹下创建文件ActivityLog.xml

Error

Microsoft Visual Studio

LoadLibrary failed for package [Visual Web Developer Trident Designer Package]

{30AE7E2B-6C02-496D-8E43-85F7A90AEFF1}

--------------------------------------------------------------------------------
8007007e

c:\Program Files\Microsoft Visual Studio 8\Common7\Packages\tridsn.dll

 

3、从 WINNT\MicroSoft.NET\Framework\v2.0.xxx 复制文件gdiplus.dll 到 Program Files\Visual Studio 8\Common7\Packages文件夹下

4、在命令行下运行命令 :devenv /resetskippkgs

25.Error spawning 'cmd.exe'.
解决方案:把cmd.exe 拷贝到VS安装目录下的VC/BIN目录里,可以解决问题。

26.尝试读取或写入受保护的内存

解决:硬件有问题,一般内存有问题

27.无法在证书存储区中找到清单签名证书

解决方法:用记事本打开项目的.csproj文件,删除类似

28.该项目中不存在目标“ResolveKeySource”。Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>

            <TargetConnectionString>Data Source=.\sql2005%3BUser >

      </PropertyGroup>

      <ItemGroup>

            <DatabaseProject Include="Database1\Database1.dbproj"/>

            <DatabaseProject Include="Database2\Database2.dbproj"/>

      </ItemGroup>

 

      <Target >

            <MSBuild

            Properties="TargetConnectionString=$(TargetConnectionString)"

            Projects="@(DatabaseProject)"

            Targets="Build;Deploy">

            </MSBuild>

      </Target>
     
    (2)在命令提示中运行:msbuild /t:BuildAllDatabaseProjects TestBuild.xml

 

</Project>

29.不能将值 NULL 插入列 '**'

原因:这是数据库表设计的错误,所涉及的表的字段中设置了不能为空的属性,但是传入的值为null,所以报错

解决方法:查看是否所传入的值是否为Null,或修改数据库中表的所对应的列的属性


30.未能加载类型"命名空间.类"...

原因:
(1)项目修改后没有进行编译
(2)项目中原有的命名空间可能被修改了
(3)项目中所需要的ascx或其他页面不存在,或不包含在项目中

解决方法:
(1)在修改完成之后,请重新生成或编译整个项目或解决方案
(2)手工修改所改动的命名空间,注意名称的大小写,再重新编译
(3)将相关的文件包含在项目中


31.不能访问只读文件“****.***"
解决方案:
给虚拟目录所对应的文件加上“Everyone/写入”权限即可

32.请求因 HTTP 状态 401 失败:Access Denied
解决方法:在iis信息服务器上把匿名访问和允许iis控制密码给勾上



 

posted @ 2007-08-19 10:15 风语战士 阅读(122) | 评论 (0)编辑
 

在坛子里经常看到一些关于Session的问题,下面做一个总结,希望对大家有所帮助:

问:为什么Session在有些机器上偶尔会丢失?
答:可能和机器的环境有关系,比如:防火墙或者杀毒软件等,尝试关闭防火墙。

问:为什么当调用Session.Abandon时并没有激发Session_End方法?
答:首先Session_End方法只支持InProc(进程内的)类型的Session。其次要激发Session_End方法,必须存在Session(即系统中已经使用Session了),并且至少要完成一次请求(在这次请求中会调用该方法)。

问:为什么当我在InProc模式下使用Session会经常丢失?
答:该问题通常是由于应用程序被回收导致的,因为当使用进程内Session时,Session是保存在aspnet_wp进程中,当该进程被回收Session自然也就没有了,确定该进程是否被回收可以通过查看系统的事件查看器获得信息。
 具体信息请参考:
 Session variables are lost intermittently in ASP.NET applications
 http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
 在1.0的时候也有一个bug会导致工作进程被回收并重启,该bug已经在1.1和sp2中修复。
 关于该bug的详细信息请参考:
 ASP.NET Worker Process (Aspnet_wp.exe) Is Recycled Unexpectedly.
 http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792

问:为什么当Session超时或者Abandoned后,新Session的ID和原来的相同?
答:因为SessionID是保存在客户端浏览器的实例里,当Session超时在服务器重新建立Session时,将使用浏览器传来的SessionID,所以当Session超时后,再重新建立后SessionID并不变。

问:为什么每次请求的SessionID都不相同?
答:该问题可能是没有在Session里面保存任何信息引起的,即程序中任何地方都没有使用Session。当Session中保存信息之后SessionID将一直和浏览器相关,此时的SessionID将不会在变化。

问:ASP和ASP.NET之间是否可以共享Session?
答:可以。但是这是一个比较复杂的过程,微软提供了官方的解决方案,请参考:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ConvertToASPNET.asp

问:什么类型的对象可以保存在Session里?
答:这依赖使用的Session的模式,当使用的是进程内(InProc)的Session那么可以轻松的保存任何对象。如果你使用了非InProc的模式,则只能保存可以序列化和反序列化的对象,如果此时保存的对象不支持序列化,则不能保存到这种模式(非InProc)的Session里。

问:为什么在Session_End中不能使用Response.Redirect和Server.Transfer方法跳转页面?
答:Session_End是一个在服务器内部激发的事件处理函数。它是基于一个服务器内部的计时器的,在激发该事件时服务器上并没有相关的HttpRequest对象,因此此时并不能使用Response.Redirect和Server.Transfer方法。

问:在Session_End中是否可以获得HttpContext对象?
答:不行,因为这个事件并没有和任何的请求(Request)相关联,没有基于请求的上下文。

问:在Web Service中该如何使用Session?
答:为了在Web Service中使用Session,需要在Web Service的调用方做一些额外的工作,必须保存和存储调用Web Service时使用的Cookie。详细信息请参考MSDN文档的HttpWebClientProtocol.CookieContainer属性。然而,如果你使用代理服务器访问Web Service由于框架的限制,两者不能共享Session。

问:在自定义自己的HttpHandler的时候,为什么不能使用Session?
答:在实现自己的HttpHandler的时候,如果希望使用Session必须实现下面的两个标记接口中的一个:IRequiresSessionState和IReadOnlySessionState,这些接口没有任何方法需要实现,只是一个标记接口和使用INamingContainer接口的方法一样。

问:当我使用webfarm时,当我重定向到其他的Web服务器时Session为什么会丢失?
答:详细信息请参考:
 PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode
 http://support.microsoft.com/default.aspx?scid=kb;en-us;325056

问:为什么我的Session在Application_OnAcquireRequestState方法中无效?
答:Session只有在HttpApplication.AcquireRequestState事件调用以后才会有效。
 详细信息请参考:
 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhandlingpublicevents.asp

问:如果使用了cookieless,我该如何从HTTP页面定向到HTTPS?
答:请尝试下面的方法:
 String originalUrl = "/fxtest3/sub/foo2.aspx";
 String modifiedUrl = "https://localhost" + Response.ApplyAppPathModifier(originalUrl);
 Response.Redirect(modifiedUrl);

问:Session在global.asax中的那些事件中有效?
答:Session只有在AcquireRequestState事件之后有效,该事件之后的事件都可以使用Session。


问:如何获得当前Session中保存的所有对象?
答:可以通过遍历所有的Session.Keys来获得。代码如下:
ArrayList sessionCollection = new ArrayList();
foreach (string strKey in Session.Keys){
  sessionCollection.Add(Session[strKey]);
}
 
问:是否可以在不同的应用程序中共享Session?
答:不能直接共享。可以参考如何在ASP和ASP.NET之间共享Session。

问:Session.Abandon和Session.Clear有何不同?
答:主要的不同之处在于当使用Session.Abandon时,会调用Session_End方法(InProc模式下)。当下一个请求到来时将激发Session_Start方法。而Session.Clear只是清除Session中的所有数据并不会中止该Session,因此也不会调用那些方法。
 
问:为了可以顺序访问Session的状态值,Session是否提供了锁定机制?
答:Session实现了Reader/Writer的锁机制:
 当页面对Session具有可写功能(即页面有<%@ Page EnableSessionState="True" %>标记),此时直到请求完成该页面的Session持有一个写锁定。
 当页面对Session具有只读功能(即页面有<%@ Page EnableSessionState="ReadOnly" %>标记),此时知道请求完成该页面的Session持有一个读锁定。
 读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么两个框架中的同一个页面都去写同一个Session时,其中一个要等待另一个(稍快的那个)完成后,才开始写。

问:Session平滑超时意味着什么?
答:Session平滑超时意味着只要你的页面访问(使用)了Session,超时时间将被刷新(可以理解为重新计时),即从该页面请求开始,将重新计算超时时间。但是,该页面不能禁用Session。它会自动的访问当前页面的Session,刷新超时时间。
 
问:在global.asax中的事件处理函数中Session为什么无效?
答:依赖于在哪个事件处理函数中使用Session,Session在AcquireRequestState事件之后才有效,该事件之后的所有事件处理函数都可以使用Session,之前的则不能。

问:当我写一个依赖于当前应用的Session的组件时,为什么不能直接使用Session["Key"]获得其值?
答:Session["Key"]实际上是this.Session["Key"],它是作为Page的一个属性提供的,所以在你的组件中不能直接使用这个属性。你可以通过下面的方式使用Session:
 HttpContext.Current.Session["Key"] = "My Seesion Value";

问:当我使用InProc模式保存Session时,此时的Session是保存在哪里?
答:不同的IIS的处理方式不同,
 当使用的是IIS5的时候Session是保存在aspnet_wp.exe的进程空间里的。
 当使用的是IIS6时,默认情况下所有的应用程序共享应用程序池,Session保存在w3wp.exe的进程空间中。

问:Session的超时设置是分钟还是秒?
答:是分钟,默认为20分钟。

问:当页面出现错误后我的Session是否将被保存?我需要在Session_End中处理一些清理工作,但是失败了,为什么?
答:Session_End只有在Session运行在InProc模式下才会被执行。Session_End使用的帐号是运行aspnet_wp工作进程的帐号(这个可以在machine.config中设置)。因此,如果在Session_End方法里,使用集成安全性链接到SQL,它将使用aspnet_wp进程的帐号打开链接,此时成功与否则依赖于你的SQL的安全性设置。
 
问:为什么当我设置cookieless为true是我在重定向的时候会丢失Session?
答:当使用cookieless时,你必须使用相对路径替换程序中的绝对路径,如果使用绝对路径ASP.NET将无法在URL中保存SessionID。
 例如:将\myDir\mySubdir\default.aspx换成..\default.aspx即可。

问:如何将SortedList存储到Session或者Cache里?
答:请参考下面的方法:
 SortedList x = new SortedList();
 x.Add("Key1", "ValueA");
 x.Add("Key2", "ValueB");
 保存到Session中:
 Session["SortedList1"] = x;
 使用下面方法获得之:
 SortedList y = (SortedList) Session["SortedList1"];
 Chahe则同理。
 
问:我为什么会获得这样的错误信息“Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive”?
答:这个问题可能在一个已经安装了Microsoft Visual Studio .NET开发环境的机器上,再安装Window Sharepoint Server(WSS)后出现。
 WSS ISAPI过滤器会处理所有的请求。当你通过虚拟目录浏览一个ASP.NET的应用程序时,ISAPI过滤器不会给文件夹目录分配URL。
 解决方法是:不要再安装了WSS的机器上使用Session。
 详细信息请参考:
 Session state cannot be used in ASP.NET with Windows SharePoint Services
 http://support.microsoft.com/default.aspx?scid=kb;en-us;837376

问:如何删除Session变量?
答:想要删除Session变量可以使用HttpSessionState.Remove()方法。
 
问:是否有办法知道应用程序的Session在运行时占用了多少内存?
答:没有。目前这个值时无法考证的,至少我现在还没有看到这方面的资料。但是可以通过性能监视器以及程序代码大概估算出来一个值。
 
问:当页面中是否了frameset,发现在每个frame中显示页面的SessionID在第一次请求时都不相同,为什么?
答:原因是你的frameset是放在一个htm页面上而不是ASPX页面。
 在一般情况下,如果frameset是aspx页面,当你请求页面时,它首先将请求发送到Web服务器,此时已经获得了SessionID,接着浏览器会分别请求Frame中的其他页面,这样所有页面的SessionID就是一样的,就是FrameSet页面的SessionID。
 然而如果你使用Html页面做FrameSet页面,第一个请求将是HTML页面,当该页面从服务器上返回是并没有任何Session产生,接着浏览器会请求Frame里面的页面,这样这些页面都会产生自己的SessionID,所以在这种情况下就会出现这种问题。当你重新刷新页面时,SessionID就会一样,并且是最后一个请求页面的SessionID。
 
问:是否可以将不同应用程序的Session保存在相同的SQL Server服务器的不同数据库上。
答:可以,请参考:
 FIX: Using one SQL database for all applications for SQL Server session state may cause a bottleneck
 http://support.microsoft.com/default.aspx?scid=kb;en-us;836680

问:在Session_End是我是否可以获得有效的HttpSessionState和HttpContext对象?
答:你可以在这个方法中获得HttpSessionState对象,可以直接使用Session来访问即可。但是不能获得HttpContext对象,因为该事件并没有和任何请求相关联,因此不存在上下文对象。

问:在SQLServer模式下使用Session,为什么我的Session不过期?
答:在SqlServer模式下,Session的过期是通过SQL Agent的注册工作完成的,请检查你的SQL Agent是否运行?
 
问:当我设置EnableSessionState为“ReadOnly”后,但是我在InProc模式下依然可以修改Session的值,这是为什么?
答:即使EnableSessionState标示为ReadOnly,但是在InProc模式下用户依然可以编辑Session。唯一不同的是,在请求过程中Session将不会被锁住。

问:我如何才能避免在链接SQL时指定密码?
答:使用信任链接或者使用加密的链接串。有关这方面的详细信息请参考:
 How To Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings
 http://support.microsoft.com/default.aspx?scid=kb;en-us;329290

问:我在我自己的类中该如何使用Session呢?
答:可以使用HttpContext.Current.Session方式使用,具体方法如下:
 HttpContext.Current.Session["SessionKey"] = "SessionValue";
 类似的你还可以使用这种方式使用Application对象。
 

问:为什么在切换成SQLServer模式后我的请求被挂起了?
答:检查在Session里面是否都保存的是可以保存在SQLServer模式下的对象,即这些对象必须支持序列化。
 

问:当Session设置成cookieless后会有什么影响?
答:当把cookieless设置成true时,主要会有下面的约束:
 1、在页面中不能使用绝对链接
 2、在应用程序中在除了Http和Https之间的切换时需要完成一些其他的步骤。
 如果发送一个链接给其他人,此时的URL里面将包含Session ID的信息,所以两个人将公用一个Session。

问:是否可以将Session保存在数据库中?
答:当然可以,详细信息请参考:http://support.microsoft.com/default.aspx?scid=kb;en-us;311209


posted @ 2007-08-18 14:24 风语战士 阅读(44) | 评论 (0)编辑
 
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字

匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]\d*$    //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$   //匹配整数
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式

原载地址:http://lifesinger.3322.org/myblog/?p=185

posted @ 2007-08-18 14:24 风语战士 阅读(20) | 评论 (0)编辑
posted on 2008-06-10 18:17  bullion  阅读(720)  评论(0编辑  收藏  举报