C#开发训练营

第5课:ASP.NET(5)——常用对象

ASP.NET Web项目中,常用的操作资源封装在一些对象中,如:

  • Request对象,包含从客户端提交到服务器的信息。
  • Response对象,向客户端发送信息的相关操作。
  • Session对象,当前会话的相关操作。
  • Server对象,服务器端操作。

在Web窗体文件中,可以直接使用这四个对象名进行操作;在代码库中,需要引用当前上下文(HttpContext)中的对象进行操作,引用对象如下:

  • HttpContext.Current.Request
  • HttpContext.Current.Response
  • HttpContext.Current.Session
  • HttpContext.Current.Server

实际应用中,开发人员可能会尽量减少代码,提高开发效率;本教程采用的方法就是将这四个对象中的常用资源封装到tWeb类中(/app_code/aspnet/base/tWeb.cs),下面分别讨论。

Response

ASP.NET Web项目中,在页面中写入返回客户端的内容,一般可以使用页面中的Reponse对象的Write()方法;但在浏览器中,会忽略回车、换行等空白字符,为了方便在页面中显示分行内容,在tWeb类中创建了WriteLine()方法,其功能是在显示内容后添加<br>标记,实现代码如下。

C#
using System.Web;

public static class tWeb
{
    //
    public static void WriteLine(string s)
    {
        HttpContext.Current.Response.Write(s + "<br>");
    }
    //
    public static void WriteLine(object obj)
    {
        HttpContext.Current.Response.Write(obj);
        HttpContext.Current.Response.Write("<br>");
    }
    // 其它代码
}

Response对象中另一个常用的方法是Redirect(),用于页面的重新定向,可以实现页面跳转功能,我们使用tWeb.Redirect()方法进行了封装,如下面的代码。

C#
public static void Redirect(string url)
{
    HttpContext.Current.Response.Redirect(url, true);
}

此外,WriteFile()还可以直接读取文件并发送到客户端,我们使用tWeb.WriteFile()方法进行了功能封装,如下面的代码。

C#
public static void WriteFile(string fpath, string filename, 
    string mime, bool isAttachment = true)
{
    HttpContext.Current.Response.ContentType = mime;
    HttpContext.Current.Response.AppendHeader("Content-Disposition",
        (isAttachment ? "attachment;" : "") + "filename=\"" + filename + "\";");
    HttpContext.Current.Response.WriteFile(fpath);
}

tWeb.WriteFile()方法定义的参数包括:

  • fpath,指定服务器端文件的路径。
  • filename,指定发送到客户端的文件名。
  • mime,文件的MIME类型,如zip可以定义为application/zip。
  • isAttachment,是否作为附件发送。设置为true时,在客户端默认会提示下载,设置为false时,在客户端会尝试使用默认的应用程序打开文件。

Request

使用Request对象,更多的是获取客户端信息,如下面的代码,在tWeb类中封装了一系列的属性,用于读取当前会话的客户端信息。

C#
// 用户IP
public static string UserIp
{
    get { return HttpContext.Current.Request.UserHostAddress; }
}
//
public static string UserHost
{
    get { return HttpContext.Current.Request.UserHostName; }
}
//
public static string[] UserLangs
{
    get { return HttpContext.Current.Request.UserLanguages; }
}
//
public static string UserLang
{
    get
    {
        string[] langs = UserLangs;
        if (langs != null && langs.Length > 0) return langs[0].ToLower();
        else return "";
    }
}
//
public static bool IsZh
{
    get
    {
        string lang = UserLang;
        return lang.StartsWith("zh");
    }
}

代码中的属性包括:

  • UserIp,获取客户端IP地址。
  • UserHost,获取客户端主机名,无法获取时返回IP地址。
  • UserLangs,获取客户端支持的语言类型,返回string[]类型。
  • UserLang,获取客户端支持语言中的第一个。
  • IsZh,判断客户端支持语言中的第一个是否是中文。

在tWeb类中还定义了一系列的GetQueryXXX()方法,用于获取URL中的参数,也可以是GET方式提交的HTML表单数据;GetFormXXX()方法用于获取POST方式提交的HTML表单数据,这也是在窗体中读取控件数据的方法。

需要获取URL查询参数中的long类型数据时,可以使用tWeb.GetQueryLng()方法。下面的代码,我们在Test.aspx.cs中的Page_Load()方法中添加测试代码。

C#
using System;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        tWeb.WriteLine(tWeb.GetQueryLng("id"));
    }
}

直接浏览页面时会显示0,因为URL中没有包含id参数。接下来,我们在浏览器地址栏中在URL后添加?id=100,即使用“http://localhost:55685/Test.aspx?id=100”浏览Test.aspx页面。此时会显示100。

Server

Server对象定义了服务器端的操作,常用的方法有:

  • MapPath()方法,返回资源的物理路径,如Server.MapPath("/")会返回网站根目录的物理路径。
  • HtmlEncode()方法,对文本内容进行HTML编码,其中的特殊字符会进行转义,如<符号会转换为&lt;。
  • HtmlDecode()方法,对HtmlEncode()方法转义的内容进行解码。
  • UrlEncode()方法,对URL地址进行转码。
  • UrlDecode()方法,对UrlEncode()方法转换的内容进行解码。

tWeb类中封装了同名方法,便于在代码库中应用。如在页面中使用如下代码就可以显示当前页面在服务器中的物理路径,当然,这些信息是不应对客户端公开的。

C#
tWeb.WriteLine(tWeb.MapPath(Request.RawUrl));

使用下面的代码可以得到相同的结果。

C#
tWeb.WriteLine(Request.PhysicalPath);

后续的内容中,我们还会使用app_data目录中的文件,如下面的代码就可以显示t001_dict.xlsx文件的物理路径。

C#
tWeb.WriteLine(tWeb.MapPath("/app_data/excel/t001_dict.xlsx"));

Session

Session对象用于操作当前会话,定义为一个集合,可以使用Session[<key>]格式直接保存或读取会话数据,下面是tWeb类中对Session对象操作的一些封装。

C#
//
public static void Clear()
{
    HttpContext.Current.Session.Clear();
}
//
public static void SetStr(string key, string value)
{
    HttpContext.Current.Session[key] = value;
}
//
public static string GetStr(string key)
{
    return tStr.Parse(HttpContext.Current.Session[key]);
}
//
public static void SetObj(string key, object value)
{
    HttpContext.Current.Session[key] = value;
}
//
public static object GetObj(string key)
{
    return HttpContext.Current.Session[key];
}

代码中定义了一些方法,分别是:

  • Clear()方法,清除Session对象中的会话数据。
  • SetStr()和GetStr()方法,保存和读取会话中的文本数据。
  • SetObj()和GetObj()方法,以object类型保存和读取会话中的数据,需要时可进行类型转换。