JQuery的使用非常简单,我们只需要从其官方网站上下载一个脚本文件并引用到页面上即可,然后你就可以在你的脚本代码中任意使用JQuery提供的对象和功能了。 在JQuery中使用Ajax方法异步获取服务器资源非常简单,读者可以参考其官方网站上提供的例子http://api.jquery.com/category/ajax/。当然,作为客户端脚本,JQuery也会遇到跨域访问资源的问题,什么是跨域访问呢?简单来说就是脚本所要访问的资源属于网站外部的资源,脚本所在的位置和资源所在的位置不在同一区域。默认情况下,浏览器是不允许直接进行资源的跨域访问的,除非客户端浏览器有设置,否则访问会失败。在这种情况下,我们一般都会采用在服务器端使用handler来解决,就是说在脚本和资源之间建立一个桥梁,让脚本访问本站点内的handler,通过handler去访问外部资源。这个是非常普遍的做法,而且操作起来也非常简单,因为会经常使用到,所以在此记录一下,方便日后使用! 首先需要在网站中创建一个handler,在Visual Studio中新建一个Generic Handler文件,拷贝下面的代码: 代码如下: <%@ WebHandler Language="C#" Class="WebApplication1.Stock" %> namespace WebApplication1 { using System; using System.IO; using System.Net; using System.Text; using System.Web; using System.Collections.Generic; using System.Linq; /// /// Asynchronous HTTP handler for rendering external xml source. /// public class Stock : System.Web.IHttpAsyncHandler { private static readonly SafeList safeList = new SafeList(); private HttpContext context; private WebRequest request; /// /// Gets a value indicating whether the HTTP handler is reusable. /// public bool IsReusable { get { return false; } } /// /// Verify that the external RSS feed is hosted by a server on the safe list /// before making an asynchronous HTTP request for it. /// public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) { var u = context.Request.QueryString["u"]; var uri = new Uri(u); if (safeList.IsSafe(uri.DnsSafeHost)) { this.context = context; this.request = HttpWebRequest.Create(uri); return this.request.BeginGetResponse(cb, extraData); } else { throw new HttpException(204, "No content"); } } /// /// Render the response from the asynchronous HTTP request for the RSS feed /// using the response's Expires and Last-Modified headers when caching. /// public void EndProcessRequest(IAsyncResult result) { string expiresHeader; string lastModifiedHeader; string rss; using (var response = this.request.EndGetResponse(result)) { expiresHeader = response.Headers["Expires"]; lastModifiedHeader = response.Headers["Last-Modified"]; using (var stream = response.GetResponseStream()) using (var reader = new StreamReader(stream, true)) { rss = reader.ReadToEnd(); } } var output = this.context.Response; output.ContentEncoding = Encoding.UTF8; output.ContentType = "text/xml;"; // "application/rss+xml; charset=utf-8"; output.Write(rss); var cache = output.Cache; cache.VaryByParams["u"] = true; DateTime expires; var hasExpires = DateTime.TryParse(expiresHeader, out expires); DateTime lastModified; var hasLastModified = DateTime.TryParse(lastModifiedHeader, out lastModified); cache.SetCacheability(HttpCacheability.Public); cache.SetOmitVaryStar(true); cache.SetSlidingExpiration(false); cache.SetValidUntilExpires(true); DateTime expireBy = DateTime.Now.AddHours(1); if (hasExpires && expires.CompareTo(expireBy) <= 0) { cache.SetExpires(expires); } else { cache.SetExpires(expireBy); } if (hasLastModified) { cache.SetLastModified(lastModified); } } /// /// Do not process requests synchronously. /// public void ProcessRequest(HttpContext context) { throw new InvalidOperationException(); } } /// /// Methods for matching hostnames to a list of safe hosts. /// public class SafeList { /// /// Hard-coded list of safe hosts. /// private static readonly IEnumerable hostnames = new string[] { "cnblogs.com", "msn.com", "163.com", "csdn.com" }; /// /// Prefix each safe hostname with a period. /// private static readonly IEnumerable dottedHostnames = from hostname in hostnames select string.Concat(".", hostname); /// /// Tests if the matches exactly or ends with a /// hostname from the safe host list. /// /// Hostname to test /// True if the hostname matches public bool IsSafe(string hostname) { return MatchesHostname(hostname) || MatchesDottedHostname(hostname); } /// /// Tests if the ends with a hostname from the /// safe host list. /// /// Hostname to test /// True if the hostname matches private static bool MatchesDottedHostname(string hostname) { return dottedHostnames.Any(host => hostname.EndsWith(host, StringComparison.InvariantCultureIgnoreCase)); } /// /// Tests if the matches exactly with a hostname /// from the safe host list. /// /// Hostname to test /// True if the hostname matches private static bool MatchesHostname(string hostname) { return hostnames.Contains(hostname, StringComparer.InvariantCultureIgnoreCase); } } }