用 Asp.Net 建立一个在线 RSS 新闻聚合器

原代码下载:RSSAggregator.msi
原文出处:Creating an Online RSS News Aggregator with ASP.NET

概要

  本文讲解了如何使用 XML Web 控件获取远程XML数据并在 ASP.NET 页面显示这些XML数据,以及使用Repeater控件发布数据库中的XML数据。在过去的几年间,随着异构平台间共享数据的需求不断增长,XML的使用也呈爆炸性增长。意识到这种趋势,微软在整个.NET框架中对 XML 提供了健壮的支持。这意味着,对于 ASP.NET 开发者来说,在Web页面 中显示和处理 XML 数据从来没有这么容易过。本文将通过生成一个 RSS2.0 聚合引擎和在线新闻聚合器来学习 XML 和 ASP.NET 技术。 本文假设读者熟悉 ASP.NET 和 XML。

目录

简介
使用 RSS 2.0 规范的聚合内容
通过 ASP.NET 页面输出聚合内容
在 ASP.NET 页面中使用聚合摘要
显示聚合摘要列表
显示特定聚合摘要的新闻项
显示特定新闻项的详细内容
未来的扩展和当前程序的缺点
总结

简介

  随着办公室和家庭上网在线时间的延长,以及 Web 站点和可访问的互联网应用程序呈持续爆炸性增长,应用程序之间能数据共享变得越来越重要。在异构平台之间共享数据需要一种平台中立的数据格式,这种数据格式要求能易于通过标准的互联网协议来传输,而这正是XML的用武之地。因为XML文件本质上只是一个文本文件,其编码格式众所周知,而且现有的XML解析器能为所有主流编程语言所用,所以XML数据能被任何平台轻松使用。
  Web 网站聚合就是一种使用 XML 来共享数据的范例,在新闻站点和网志中经常可以看到。采用 Web 网站聚合技术,网站能以 XML 格式的 Web 可访问的聚合文件来发布最新内容。网站使用的聚合格式有很多种,其中最流行的一种格式就是 RSS2.0。( RSS2.0 规范被发布在 Harvard Law 网站 的技术栏目上)。此外,MSDN 杂志有一个聚合文件:MSDN杂志:本期刊物, 其中列出了最新一期 MSDN 杂志上的文章,包括到在线版本文章的链接。
  一旦 Web 站点有了公开发布聚合文件,那么不同的客户端就可以消费它。消费聚合文件的方式有很多种,比如,某个提供 .NET 技术资源的站点可能希望在网站中 添加最新的 MSDN 杂志文章标题。聚合文件还常常被新闻聚合器程序所用,这种程序被专门设计用来获取和显示不同来源的聚合文件。
  随着人们越来越注重使用 XML 数据,在 ASP.NET 页面中处理 XML 数据的能力变得比以往更关键。既然 Web 站点聚合如此重要, 本文我们就来创建一个 Web 站点聚合文件生成程序和一个在线新闻聚合器。在建立这两个微型程序的过程中,我们将讲述如何访问和显示XML数据,不论这些数据是来自远端的Web服务器还是本地的文件系统。我们将演示如 何多种不同的方法显示XML数据,比如:用 Repeater 控件以及用 ASP.NET XML Web控件。
  因为这只是一篇小文章,不可能长篇大论,我会假设读者您熟悉 XSLT 和 XPath。如果您不熟悉,建议在看这篇文章之前先访问以下资源:

FAQ: What is XSLT and How Does it Relate to XML? XSL Tutorial XPath Tutorial 使用 RSS 2.0 规范的聚合内容

  本文我们将要创建的第一个微型程序是一个聚合文件生成器。针对这个迷你程序,假设你是一个大型新闻网站(如 MSNBC.com)的 Web 开发者,所有的新闻内容都保存在 Microsoft SQL Server 2000 数据库中。具体地说,这些文章是 都保存在一个名为 Articles 的表中,表中以下字段与我们的程序密切相关:

ArticleID—主键,自增长的整型字段,用来唯一标识每一篇文章; Title— 指定标题,字段数据类型: varchar(50); Author—指定作者,字段数据类型: varchar(50); Description—新闻内容描述,字段数据类型: varchar(2000); DatePublished—新闻发布日期,字段数据类型:datetime

  请注意,Articles 表中可能还有其它字段,上面所列的只是我们在创建聚合文件的时候所要用到的字段。而且,这只是一个非常简单的数据模型,在 是应用的数据库环境中,你可能会使用更加标准化的数据库模型,比如具备一个单独的 authors (作者)表,有一个建立作者和文章之间多对多关系的表等等。
  下一步,我们将创建一个ASP.NET页面,用格式化好的 RSS2.0 XML 文件显示一个最新的新闻列表。在讲述如何在 ASP.NET 页面 中完成这种转换之前,我们要先介绍一下 RSS2.0 规范的内容。我们应该记住,在整个规范中,RSS 是被设计用来为聚合内容提供一个数据模型。那么 毫无疑问,它会有一系列的 XML 元素,用来描述 Web 站点要聚合的内容信息,以及一系列用来描述某一特定新闻项的 XML 元素。最后,不要忘记 RSS 聚合文件是一个 XML 格式文件,必须符合 XML 格式化的准则, 也就是:

所有 XML元素必须正确嵌套; 所有的属性值要用引号包含起来; <, >, &, "和''符号要相应地替换为 <,>, &, " 和 ';

  而且,XML格式是大小写敏感的,这就意味着,XML元素的起始和终止标签必须匹配,拼写和大小写都必须一致。
  RSS2.0 的根元素是元素,这个元素可以有一个版本号的属性,例如:


  ...

元素只有一个子元素,用来描述聚合的内容。在元素里面有三个必需的子元素,用来描述 Web 站点的信息。这三个元素是:

title—定义聚合文件的名称,一般来说,还会包括Web站点的名称; link—Web站点的URL; description—Web站点的一段简短的描述。

除此之外,还有一些可选元素来描述站点信息。这些元素的更多信息请参见 RSS2.0规范

每一个新闻项目放在一个单独的元素中。元素可以有任意数量的元素。每个元素可以有多种的子元素,唯一的要求是最少必须包含元素和<description>元素其中一个作为子元素。以下列出了一些相关的<item> 子元素: </strong></p> <strong></strong> <strong>title—新闻项目的标题; link—新闻项目的URL; description—新闻项目的大纲; author—新闻项目的作者; pubDate—新闻项目的发布日期 </strong> <p><strong>  下面是一个非常简单的 RSS2.0 聚合文件。你可以从 <font color="#002c99">RSS generated by Radio UserLand</font> 看到其他的RSS2.0文件的例子。</strong></p> <strong></strong> <pre><strong><rss version="2.0"> <channel> <title>Latest DataWebControls.com FAQs http://datawebcontrols.com This is the syndication feed for the FAQs at DataWebControls.com Working with the DataGrid http://datawebcontrols.com/faqs/DataGrid.aspx Mon, 07 Jul 2003 21:00:00 GMT Working with the Repeater This article examines how to work with the Repeater control. http://datawebcontrols.com/faqs/Repeater.aspx Tue 08 Jul 2003 12:00:00 GMT

  关于元素的格式有一点特别重要,再此要讲一下。RSS 要求日期必须按照 RFC822 日期和时间规范 进行格式化,此格式要求:开头是一个可选的3字母星期缩写加一个逗号,接着必须是日加上3字母缩写的月份和年份,最后是一个带时区名的时间。另外,要注意 子元素是可选的:上 述文件第一个新闻没有 元素,而第二个新闻就有一个。

通过 ASP.NET 页面输出聚合内容

  现在,我们已经知道了如何按照 RSS2.0 规范存储我们的新闻项,我们已经就绪创建一个 ASP.NET 页面,当用户发出请求时,就会返回网站聚合 的内容。更确切地说,我们将建立一个名字叫 rss.aspx 的 ASP.NET 页面,这个页面会按照 RSS2.0 规范的格式返回 Articles 数据库表中的最新的 5 个新闻项 。
  可以有几种方法来完成这件事,稍后将会讲到。但是现在,我们首先要完成一件事,那就是先要从数据库中获得最新的5个新闻项。这可以用下面的 SQL 查询语句获得:

SELECT TOP 5 ArticleID,Title,Author,Description,DatePublished FROM Articles ORDER BY DatePublished DESC

  获得了这些信息以后,我们需要把这些信息转换成相应的 RSS2.0 格式聚合文件。要把数据库的数据显示为XML数据最简单、快速的方法就是使用 Repeater 控件。准确地说,Repeater 控件 将在 HeaderTemplate 和 FooterTemplate 模版里显示元素、元素以及站点相关的 元素标签,在 ItemTemplate 模版里面显示 元素。下面是我们这个 ASP.NET 页面(.aspx文件)的 HTML 部分 :

<%@ Page language="c#" ContentType="text/xml" Codebehind="rss.aspx.cs"
  AutoEventWireup="false" Inherits="SyndicationDemo.rss" %>

  
    
      
        ASP.NET News!
        http://www.ASPNETNews.com/Headlines/
        
          This is the syndication feed for ASPNETNews.com.
        
  

  
        
          <%#<b> FormatForXML</b>(DataBinder.Eval(Container.DataItem,
                                              "Title")) %>
          
             <%# FormatForXML(DataBinder.Eval(Container.DataItem, 
                                     "Description")) %>
          
          
             http://www.ASPNETNews.com/Story.aspx?ID=<%# 
                   DataBinder.Eval(Container.DataItem, "ArticleID") %>
          
          <%# FormatForXML(DataBinder.Eval(Container.DataItem, 
                                             "Author")) %>
          
             <%# String.Format("{0:R}", 
                  DataBinder.Eval(Container.DataItem, 
                                         "DatePublished")) %>
           
        
  

  
      
      
  
      

  首先要注意的是:上面这段代码例子只包括 Repeater 控件,没有其它的 HTML 标记或 Web 控件。这是因为我们希望页面只输出 XML 格式的数据。实际上,观察一下 @Page 指令,你就会发现 ContentType 被设置为XML MIME 类型(text/xml)。其次要注意的是:在 ItemTemplate 模版里,当 在 XML 输出中添加数据库字段Title、Description 和 Author 时,我们调用了辅助函数 FormatForXML()。我们 很快就会看到,该函数被定义在后台编码的类中,其作用只是将非法的 xml 字符替换为它们对应的合法的转义字符。最后我们应该注意,在 元素里面的数据库字段 DatePublished 是用 String.Format 来格式化的。标准的格式描述符“R”对 DatePublished 的值进行相应的格式化 。
  此 Web 页面的后台编码类代码并不复杂。Page_Load 事件处理函数只是将数据库查询结果绑定到 Repeater控件,FormatForXML()函数根据需要做一些简单的字符串替换。为 简单起见,下面的例子只列出了这两个函数的代码:

在浏览器中访问 rss.aspx 页面的截图参见图一。

图一 通过浏览器访问 Rss.aspx 页面

  在我们生成在线新闻聚合器之前,让我谈谈这个聚合引擎一些可能的增强功能。首先,每一次访问 rss.aspx 页面的时候,都要访问一次数据库。如果预期可能有大量的人频繁地访问 rss.aspx 页面,使用输出缓存是很有价值的。其次,通常新闻网站会将聚合的内容分为不同的类别。例如:News.com 有一些专门的聚合内容区, 比如针对企业计算、电子商务、通信的内容等等。在数据库表 Articles 中加入表示类别的 Category 字段就可以很容易地提供这种支持。这样 一来,在 rss.aspx 页面中,可以接收一个表示显示分类的查询参数,然后只搜索指定的新闻项分类即可。

在 ASP.NET 页面中使用聚合摘要

  为了测试我们刚建立的聚合引擎,我们将创建一个在线新闻聚合器,允许采集任意数量的聚合内容摘要。聚合器的界面很简单,参见图二。它包括三个框架页面。左边框架以列表形式列出了不同的聚合内容摘要。右上部框架显示所选的聚合内容摘要包含的新闻项以及查看该新闻项的链接。最后,在右下部框架则显示选中的新闻项标题和内容。顺便提及一下,这样的界面基本上是各种类型的聚合器的一个事实上的标准界面,包括新闻聚合器、email客户端软件和新闻组阅读器都是这样的界面。


图二 新闻聚合器用户界面的截图

  第一步是创建一个html页面来建立框架用户界面。幸运的是,在Visual Studio.NET 2003 中,这一过程非常容易。只需要在Web应用程序解决方案中添加一个新 的项目,选择新项目类型为 Frameset。(我在我的工程中将这个新文件命名为 NewsAggregator.htm。我之所以将它设置为 html 文件而不是 asp.net 页面, 是因为这个页面只包括建立框架的 html 代码。每一个单独的框架会显示一个 asp.net 页面)。下一步,参见图三,Frameset 模版向导会启动,简单地选择选项“Nested Hierarchy”,然后按ok按钮就可以了。


图三 VS2003 中 Frameset 模版向导画面

  然后 Frameset 模版向导会创建一个HTML页面,里面已经加入了框架的源代码。 只要将左边框架的src属性设置为 DisplayFeeds.aspx,它是列表显示聚合摘要 asp.net 页面的 url。至此 NewsAggreator.htm 页面就完成了。
  以下三个部分,我们将讲述如何创建在线新闻聚合器的三个组件,它们分别是显示聚合摘要列表的 DisplayFeeds.aspx;显示特定聚合摘要新闻项 的 DisplayNewsItems.aspx;以及显示指定聚合摘要特定新闻项具体内容的 DisplayItem.aspx。

显示聚合摘要列表

  现在我们需要创建 DisplayFeeds.aspx 页面。该页面要显示订阅的聚合摘要列表。作为示范,我将这些聚合摘要放在一个叫 Feeds 的数据库表中。当然你也可以将它们放在一个XML文件中。表 Feeds 有如下四个字段:

FeedID—主键,自增长整数类型,唯一标示一个摘要 Title—摘要名称,数据库字段类型:varchar(50) URL—RSS 摘要的 URL,数据库字段类型:varchar(150) UpdateInterval—摘要更新频率(分钟),数据库字段类型:int

DisplayFeeds.aspx 页面使用一个 DataGrid 控件显示聚合摘要的列表。这个 DataGrid 只有一个 HyperLinkColumn 列,显示 Title 字段的内容并且链接到 DisplayNewsItems.aspx 页面, 在查询字符串中 要传递 FeedID 字段的值。以下是 DataGrid 控件的声明,为简单起见,省略了一些无关的部分):


   ...
   
     
     
   
      

  这里要注意的关键是 HyperLinkColumn 列的定义。它的 Target 属性设置为右上部分框架的名称,这样当用户点击的时候,DisplayNewsItems.aspx 页面就会显示在右上部分的框架中。另外, 属性 DataNavigateUrlField、DataNavigateUrlFormatString 和 DataTextField 也做了相应的设置, 以便超链接显示摘要的标题,并且当点击它时,就会将用户带到 DisplayNewsItems.aspx 页面,并在查询串中将 FeedID 字段的内容传 过来。(该页面的后台代码类只访问来自 Feeds 表的摘要清单,按照 Title 字段的字母顺序返回,接着将查询结果绑定到 DataGrid 控件。 由于篇幅所限,本文在此不列出代码。)

显示特定聚合摘要的新闻项

  我们面临的下一个任务是创建 DisplayNewsItems.aspx 页面。这个页面会以链接的形式显示所选聚合摘要的新闻项标题,当点击标题时,新闻的内容就会显示在右下部分的框架中。要完成这一任务,我们会面临以下两个主要的挑战:

通过指定的 URL 访问 RSS 聚合摘要; 将接收到的 XML 数据转换为相应的 HTML;

  幸运的是,在.NET 框架中,要实现这两个任务都不是很难。对于第一个任务,只需要两行代码,我们就可以将远程的xml数据装载到一个XmlDocument对象中。而第二个任务呢, 借助 ASP.NET XML Web 控件在ASP.NET 页面中显示XML数据也比较容易。
  XML Web 控件被设计用于在 Web 页面中显示原始或者转换过的 XML 数据。使用 XML Web 控件的第一步是定义XML数据源,通过 定义一系列的属性,用许多方法都可以完成这一工作。使用 Document属性,你可以指定一个 XmlDocument 实例作为 XML Web 控件的 XML 数据源。如果XML数据存在于 Web 服务器文件系统的一个文件中,可以用 DocumentSource 属性,只要提供该 XML 文件的相对或者绝对路径就可以了。最后,如果你 的 XML数据是一个字符串,那么你可以将这个字符串的内容赋给控件的 DocumentContent 属性。这三种办法都可以将 XML 数据与 XML 控件联系起来。
  通常,在将 XML 数据显示到 Web 页面之前,我们会以某种方式转换 XML 数据。XML Web 控件允许我们指定一个 XSLT 样式表来做这个转换工作。与 XML 数据相似,XSLT 样式表可以通过 两个属性之一,以两种不同的方式中的一种来设置,一是 Transform 属性可被赋值给 XslTransform 实例,二是将本地 Web 服务器上 XSLT文件的 相对或绝对路径赋予 TransformSource 属性。
  现在我们来创建 DisplayNewsItems.aspx 页面。在添加 XML Web 控件以及编写后台代码类之前,我们需要在 HTML 部分加入一小段客户端 JavaScript 代码。准确地说,是在 html 部分的 标签里面 添加如下的

  每当 DisplayNewsItems.aspx 页面装载的时候,这段客户端 JavaScript 代码会在右下角的框架中显示一个空白页。为了理解为什么要加入这段代码,我们来看看省略这段代码,我们会碰到什么情况:

用户在左边的框架中点击聚合摘要,浏览器会在右上部的框架中装载摘要新闻项; 用户在右上部框架中点击某个新闻项,浏览器会在右下部框架中装载这个新闻项 的详细内容; 现在用户在左边的框架中点击其它的聚合摘要,浏览器会在右上部分的框架中装载新的摘要新闻项;

  现在,前一个新闻项的详细内容还显示在右下部的框架中!通过上面的客户端 Javascript 代码,每次点击左面框架的摘要便可以清除右下部框架 的内容,以消除这一瑕疵。
  现在我们处理了客户端代码的问题之后,让我们把注意力转到添加 XML Web 控件。一旦加入 XML Web 控件,将其 ID 属性设置为 xsltNewsItems,TransformSourc 属性设置为 NewsItems.xslt(我们将要创建的 XSLT 样式表文件的名称)。现在,在 Page_Load 事件处理函数中,我们需要 在某个 XmlDocument 实例中获取远程 RSS 聚合文件,然后将该 XML Web 控件的 Document 属性赋给该 XmlDocument 实例。

  在 Page_Load 事件处理函数中,与我们要实现的任务有密切关系的代码是最后三行代码。这三行代码创建一个新的 XmlDocument 对象, 加载远程 RSS 摘要内容,然后将这个 XmlDocument 对象赋给 XML Web 控件的 Document 属性。访问远程 XML 数据并 将它们显示在 ASP.NET 页面中就是这么简单,难道给你留下的印象不深吗?
  剩下我们要做的一件事就是创建 XSLT 样式表,NewsItems.aspx。下面是样式表的第一版的草稿:



   

   
      
      
         
  • DisplayItem.aspx?ID= rbottom ()
  •   这个XSLT样式表只有一个模版,用于匹配“/rss/channel”XPath表达式。这个模版先是以粗体显示元素的内容。然后,循环获取每一个<item>元素,对于每一个元素,显示一个到 DisplayItem.aspx 页面的超链接,在查询字符串中传递<item>元素的位置属性。要留意超链接的 target 属性设置为 rbottom,右下部框架的名称。最后,显示每一个新闻项的标题和<pubDate>元素。<br>  该 XSLT 样式表中有两个项目,并不是每个人都熟悉。首先是 <xsl:value-of> 元素中的 disable-output-escaping="yes" 属性。从本质上讲,这个属性的设置通知 XSLT 引擎不要转义那些非法的 XML 字符,比如:&, < , >, " 和 ''。为了理解这个设置的意义,就要知道,如果不设置该属性(也就是设置为默认值"no"),那么如果标题包含一个转义的&字符&,那么输出的 html 文件中也会有一个&,而不单单是一个字符&。如果你再仔细想一想,你会发现这种情况会导致很多问题。例如,假设一个聚合文件的标题是<b>“</b>Matt''s <i>Cool</i> Blog<b>”,</b>如果输出转义没有被禁止,那么输出就会保留 “Matt''s <i>Cool</i> Blog”,在 Web 页面就会显示为 "Matt''s <i>Cool</i> Blog"。当用 disable-output-escaping="yes"设置禁止输出转义时,输出就不会被转义,上面的内容就会被当作“Matt''s <i>Cool</i> Blog”,显示在页面上就是我们想要的“Matt''s Cool Blog”。<br>另一个要注意的是元素<a>。这个奇怪的语法会生成下面的输出内容:</strong></p> <strong></strong> <pre><strong><a href="DisplayItem.aspx?ID=<i>position</i>"><i>news item title</i></a></strong></pre> <strong></strong> <p><strong>  之所以要使用这种语法,是因为要给 XSLT 样式表中某个你要创建的元素添加一个属性,然后在该元素的标签里使用 <xsl:attribute> 语法 。有关该语法的一些例子可在 W3Schools 网站上找到:<font color="#002c99">The <xsl:attribute> Element</font>。<br>  最后要注意的是,超链接的ID查询字符串的值是来自于 <xsl:number> 元素,从 position() 函数中返回的值。<xsl:number> 元素仅仅是输出一个数值。position()函数是一个 XPath 函数,用来返回 XML 文档中当前节点的顺序位置。这意味着对于第一个新闻项,position() 函数返回 1,第二个 新闻项,position函数返回 2,以此类推。我们需要记录这个值并将它通过查询字符串传递出去。这样当 DisplayItem.asp 页面被访问时,就可以知道显示 RSS 聚合摘要的什么项目了。<br>  聪明的读者可能已经注意到,我们的 XSLT 样式表没有全部完成,因为 FeedID 参数没有通过查询字符串传递到 DisplayItem.aspx 页面。要明白 这是为什么,我们回顾一下在 ID 查询串参数中所传递的是用户拟察看详细信息的<item>元素顺序号。也就是说,如果用户点击第四条新闻项,页面 DisplayItem.aspx?ID=4 就会被 加载到右下部分的框架中。问题在于 DisplayItem.aspx 页面无法确定用户希望查看哪一个摘要。有两个不同的方法可以解决这个问题,比如可以在右下部框架中用客户端 Javascript 代码读取右上部框架的 URL,然后确定FeedID 的值。在我看来,更简单的办法是和 ID 参数一起将 FeedID 的值通过查询字符串传递 。<br>  这样的话,有一个难题是 XSLT 样式表操纵的 RSS XML 数据中并没有 FeedID 值。但是 DisplayNewsItems.aspx 页面知道 FeedID 值,需要一种方法让 XSLT 样式表也知道这个值。通过使用 XSLT参数可以 实现完成。<br>   XSLT 参数的使用是非常简单。在 XSLT 样式表中,你需要在 <xsl:template> 元素中加入一个<xsl:param> 元素, 该元素提供参数的名称。下面的代码将这个参数命名为 FeedID:</strong></p> <strong></strong> <pre><strong><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/rss/channel"> <b><xsl:param name="FeedID" /></b> ... </xsl:template> </xsl:stylesheet> </strong></pre> <strong></strong> <p><strong>现在,就可以用下面的语法在<xsl:value-of>元素中使用这个参数了:</strong></p> <strong></strong> <pre><strong><xsl:value-of select="$<i>parameterName</i>" /> </strong></pre> <strong></strong> <p><strong>最后,在我们的 XSLT 样式表中加入下面的代码,我们就可以把 FeedID 查询字符串参数加到超链接中了:</strong></p> <strong></strong> <pre><strong><a> <xsl:attribute name="href">DisplayItem.aspx?ID=<xsl:number value="position()" /><b>&FeedID=<xsl:value-of select="$FeedID" </b> <b><b> /</b>></b></xsl:attribute> </strong></pre> <strong></strong> <p><strong>  注意在ID查询字符串参数后面我们加了一个&字符(转义&),这样我们就可以传递 FeedID 参数的值到查询字符串的 FeedID 参数中了。 这就是我们要在 XSLT 样式表中添加的内容。<br>  剩下的工作是在 DisplayNewsItems.aspx 页面的 Page_Load 事件处理函数中设置这个参数的值。通过使用 XsltArgumentList 类可以完成这一工作。这个类有一个 AddParameter() 方法。一旦我们创建了这个类的一个实例,加入了相应的参数,就可以将这个 实例赋给 XML Web 控件的 TransformArgumentList 参数了。下面的代码显示了更新后的 DisplayNewsItems.aspx 页面 Page_Load 事件处理函数:</strong></p> <strong></strong> <p><strong><br><strong><br><br>显示特定新闻项的详细内容</strong> </strong></p> <strong></strong> <p><strong>  还剩下最后一件需要做的事情是显示用户选择的特定新闻项的详细内容。这些详细内容将显示在右下部的框架中,而且将会显示新闻项的标题,描述和新闻项的链接等信息。和 DisplayNewsItem.aspx 页面 类似,DisplayItem.aspx 页面首先将根据传入的 FeedID 查询字符串参数获取远程的 RSS 聚合摘要,然后它会用 XML Web 控件显示这些详细内容。实际上,DisplayItem.aspx 页面的 Page_Load 事件处理函数和DisplayNewsItem.aspx 页面的 该函数几乎一样,只有以下两个小小的区别: </strong></p> <strong></strong> <strong>DisplayItem.aspx 页面需要读取ID查询字符串参数的值; DisplayItem.aspx 页面使用一个 XSLT 参数,但是这个参数与 DisplayNewsItem.aspx 页面用的参数是不一样的; </strong> <p><strong>DisplayNewsItem.aspx 和 DisplayItem.aspx 页面一样都需要在参数中传递一个 XSLT 样式表。DisplayNewsItem.aspx 页面传递的是 参数 FeedID,而 DisplayItem.aspx 还需要传入 ID 参数,它表示 XSLT 样式表应该显示那个新闻项。这个细小的差别在以下代码中以粗体显示,以下 代码省略了与 DisplayNewsItems.aspx 页面相同的部分:</strong></p> <strong></strong> <p><strong></strong></p> <strong></strong> <p><strong>以下是转换 XML 数据的 XSLT 样式表:</strong></p> <strong></strong> <pre><strong><?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" omit-xml-declaration="yes" /> <b> <xsl:param name="ID" /></b> <xsl:template match="/rss/channel"> <b><xsl:value-of select=<b>"item[$ID]/title" </b> disable-output-escaping="yes" /></b> <p> <xsl:value-of select=<b>"item[$ID]/description" </b> disable-output-escaping="yes" /> </p> <a> <xsl:attribute name="href"><xsl:value-of select=<b>"item[$ID]/link" </b>/></xsl:attribute> <xsl:attribute name="target">_blank</xsl:attribute> Read More... </a> </xsl:template> </xsl:stylesheet> </strong></pre> <strong></strong> <p><strong>  注意 <xsl:param> 元素被用于声明  ID XSLT 参数。然后,在几个不同的 <xsl:value-of> 元素中,ID 参数 被用来从 <item> 元素列表中抓取特定的 <item> 元素。在 XPath 的语法中,elementName[i]意思是根据相应元素名 存取第i个元素。例如,item[1]将只获取第一个<item>元素,item[2]则获取第二个元素。所以 item[$ID]是获取由 XSLT 参数 ID 定义的 特定 <item> 元素。<br>  最后,值得注意的还有在样式表靠近末尾部分的超链接 Read More…,它的target属性设为空,这样的话当用户点击 Read More… 链接的时候,浏览器会打开一个新的窗口。</strong></p> <strong><strong>未来的扩展和当前程序的缺点</strong> </strong> <p><strong>  本文讲述的代码中有一个明显的缺点就是每次用户点击左边框架的某个聚合摘要或者在右上部框架点击某个新闻项时,远程聚合摘要都会被装载和解析。每次用户点击远程聚合 摘要时,所有的项都被加载,这样的效率无疑是很差的。每次用户点击一个新闻项标题就重新装载整个远程聚合摘要也是很浪费资源的。这样的方法不仅没有效率,对提供发布服务的个人或者公司也是不礼貌的,因为这些 连续的、不没必要的请求占用了他们的 Web 服务器的负载资源。<br>  这个缺点在本文附带的源代码中已经得到解决。具体来说,.NET数据缓存可以用来存放不同摘要的 XmlDocument 对象。缓存间隔设置为数据表 Feeds 中 UpdateInterval 字段定义的值。(当然,由于某些原因,摘要的 XmlDocument 对象有可能会被提前清除出缓存)<br>  这个系统的另外一个缺点是在右上部框架和右下部框架之间没有状态的保存。为了说明这样会引起什么问题,考虑以下的动作: </strong></p> <strong></strong> <strong>用户点击左边框架的某个聚合摘要链接,在右上部框架中装载这个摘要的新闻项目。假设这个摘要的UpdateInterval 的值是30,则表示这些内容在30分钟之 后会过期; 装载右上部框架的新闻项的同时,这些内容被缓存起来; 用户离开去吃午饭; 发布聚合内容的网站增加了一条新的新闻项; 我们的用户一个小时午饭后回来了,这个 摘要的 XmlDocument 的缓存已经过期; 用户点击右上部框架的第一条新闻项,将会在右下部分框架中装载 DisplayItem.aspx,传入 ID 参数值1; DisplayItem.aspx 页面在缓存中没找到 XmlDocument 对象,只好重新获取远程摘要。这样就会获得新的数据了(别忘了,步骤 4 已经加了一个新的新闻项),然后此页面会显示第一条新闻项目(因为ID参数的值为1) ; 用户看到了新的新闻项,但是内容会令他感到有点困惑,因为已经不是他所点击的那一条新闻了,而且右上部也没有显示那条新的新闻。 </strong> <p><strong>  之所以出现这样的问题,是因为 ID 参数没有唯一地标识一个新闻项,它只是一个特定时间点上新闻项列表中的一个偏移量。解决这个问题的一个好的方法是不要用数据缓存来保存聚合 摘要,而是使用数据库或者持久介质的其它方式(比如 Web 服务器本地文件系统的 XML 文件)。如果使用数据库,每一个新闻项都可以拥有一个唯一的标识号,可以用来传递到右下角的框架中。这种方法可以保证解决上面提到的问题。当然也会增加系统的复杂性,比如需要决定何时从数据库中清除掉旧的新闻项 。<br>  本文现有的应用程序还缺少异常处理,而这肯定是应该加上的。尤其是当从远程 RSS 聚合摘要文件获取数据并加载到 XmlDocument 对象时,应该加上异常处理。因为远程的文件可能不存在或者格式不正确。<br>  还有很多增强功能可以轻松地加入到这个在线新闻聚合器。一个明显的功能是需要一个管理页面来允许用户添加,删除和编辑他们现在的聚合摘要。还有,如果能允许用户自定义分类 ,将他们的聚合摘要按类别放在一起就更好了。另外,现在的用户界面还是比较粗糙的,但是通过增加一些 XSLT 样式表生成的 HTML 代码或者在几个框架里面增加一些样式表就可以很容易地美化一下界面。最后,在html标签里面加一些<meta>元素,可以让右上部框架定时地去刷新,使得用户不用自己手工去刷新页面就可以看到最新的新闻项目。</strong></p> <strong></strong> <blockquote> <strong><b>注解 (2003年8月4日):</b> 在这篇文章发布以后,一些读者用 Email 告诉通知我在显示特定 RSS 聚合项的 <description> 元素时,有两个潜在的问题:</strong> </blockquote> <strong></strong> <blockquote> <strong>1、Disable-output-encoding 属性,这个属性用在 <xsl:value-of> 元素中,但是并不是所有的 XSLT解析器都实现了这个功能。.NET XSLT 解析器支持 disable-output-encoding,但是还是要 注意一下,因为读者可能试图将这个应用程序移植到其它平台。</strong> </blockquote> <strong></strong> <blockquote> <strong>2、<description> 元素的 HTML 内容是被原封不动地输出的。但是,这些 HTML 内容可能包含恶意代码,比如 <script> 或者 <embed> 代码块。理想情况下,这些代码应该被剔除掉。为了清除掉这些有潜在危险的代码,可能需要用到一些扩展函数(参见 <font color="#002c99">Extending XSLT with JScript, C#, and Visual Basic .NET</font>)。想查看从 RSS 聚合 摘要剔除 HTML 内容的更多信息,可以参见''Dive Into Mark'' <font color="#002c99">日志</font>.</strong> </blockquote> <strong><strong>总结</strong> </strong> <p><strong>  在本文中,我们不仅讲到如何创建一个聚合引擎,还创建了一个在线新闻聚合器。在建立这两个应用程序时,我们都采用了在 ASP.NET 页面显示 XML 数据的技术。在聚合引擎里面,我们使用了 Repeater 控件以 XML格式来显示数据库中的数据。而在新闻聚合器里面,我们使用了 XML Web 控件和 XSLT 样式表。<br>  我邀请你下载本文的在线新闻聚合器,然后根据你的需要来增强它。如果有任何关于这个应用程序或者这篇文章讨论的概念方面的问题,随时恭候你的 EMail。我的 EMail<span style="color:#00ff00;"> </span><font color="#002c99">mitchell@4guysfromrolla.com</font>.</strong></p> <strong></strong> <p><strong>编程快乐!</strong></p> <strong><strong>推荐链接</strong> </strong> <strong><font color="#002c99">Displaying XML Data in an ASP.NET Web Page</font> ASP.NET XML Web Control Technical Documentation: reference for the <font color="#002c99">XML Class</font> <font color="#002c99">XSLT Tutorial</font> <font color="#002c99">XPath Tutorial</font> The <font color="#002c99">XML Forum</font> at the ASP.NET Forums <font color="#002c99">Caching with ASP.NET</font> </strong> <p><strong></strong></p> <strong><b> 作者介绍<br>    Scott Mitchell</b>, 五本ASP/ASP.NET书籍的作者,4GuysFromRolla.com的创办人, 在过去五年里面一直 在研究 Microsoft 的 Web 技术,ASP 和 ASP.NET 社区的活跃人物, Scott 非常热爱 ASP 和 ASP.NET 技术,对能够帮助他人学习这些激动人心的技术感到 非常高兴。关于 DataGrid, DataList 和 Repeater 控件方面的信息,可以留意 Scott 的最新书籍《ASP.NET Data Web Controls Kick Start》(ISBN: 0672325012)。 </strong> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1293159587003834368"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(Asp.Net)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1949568602441052160.htm" title="深入学习FormView控件及其在ASP.NET中的应用" target="_blank">深入学习FormView控件及其在ASP.NET中的应用</a> <span class="text-muted">鸟看世界</span> <div>本文还有配套的精品资源,点击获取简介:本文深入介绍了ASP.NETWebForms中的FormView控件,解释了其功能特性及配置方法,并通过具体实例展示了如何使用FormView进行数据显示、编辑、插入、更新和删除操作。文章详细解释了FormView的基本结构、使用模板、CommandField配置以及分页实现,并讨论了相关的事件处理。通过学习本教程,开发者可以掌握如何在实际项目中应用FormV</div> </li> <li><a href="/article/1949053138665271296.htm" title="AJAX与ASP.NET Web方法的实践与原理" target="_blank">AJAX与ASP.NET Web方法的实践与原理</a> <span class="text-muted">t0_54coder</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%89%8B%E5%86%8C/1.htm">编程问题解决手册</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ajax/1.htm">ajax</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91/1.htm">个人开发</a> <div>在现代Web开发中,AJAX(AsynchronousJavaScriptandXML)是提升用户体验的关键技术之一,尤其在需要与服务器交互而不刷新整个页面的情况下。今天,我们将探讨如何在ASP.NET中使用AJAX结合Web方法(WebMethod)来实现这一目的,并深入分析其中的原理。实例背景假设我们有一个简单的温度转换器,需要将华氏温度转换为摄氏温度,我们希望这个转换过程是即时的,不需要用户</div> </li> <li><a href="/article/1949052131377999872.htm" title="50、深入解析微软.NET框架" target="_blank">50、深入解析微软.NET框架</a> <span class="text-muted">kk1234</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6%E5%85%A8%E8%A7%A3%E6%9E%90/1.htm">网络应用开发框架全解析</a><a class="tag" taget="_blank" href="/search/.NET%E6%A1%86%E6%9E%B6/1.htm">.NET框架</a><a class="tag" taget="_blank" href="/search/C%23%E7%BC%96%E7%A8%8B/1.htm">C#编程</a><a class="tag" taget="_blank" href="/search/ASP.NET/1.htm">ASP.NET</a> <div>深入解析微软.NET框架1.引言在现代软件开发中,微软的.NET框架已经成为构建和部署各种应用程序的重要工具。它不仅支持面向组件编程,还提供了强大的开发环境,使得开发者可以创建高效、可靠且易于维护的应用程序。本文将深入探讨.NET框架的核心组件,包括C#编程语言、ASP.NET和Web服务支持,揭示其在开发基于HTML的Web应用程序方面的强大功能。2..NET框架概述.NET框架是一系列技术的集</div> </li> <li><a href="/article/1949050112709816320.htm" title="4、ASP.NET MVC与jQuery开发指南" target="_blank">4、ASP.NET MVC与jQuery开发指南</a> <span class="text-muted">corn8</span> <a class="tag" taget="_blank" href="/search/%E6%8E%A2%E7%B4%A2.NET/1.htm">探索.NET</a><a class="tag" taget="_blank" href="/search/ASP.NET/1.htm">ASP.NET</a><a class="tag" taget="_blank" href="/search/MVC/1.htm">MVC</a><a class="tag" taget="_blank" href="/search/jQuery/1.htm">jQuery</a><a class="tag" taget="_blank" href="/search/%E8%B7%AF%E7%94%B1/1.htm">路由</a> <div>ASP.NETMVC与jQuery开发指南1.路由与数据库访问在ASP.NETMVC中,MapRoute的第三个参数用于定义URL各部分的默认值,这使得我们可以省略部分或全部URL部分。若省略控制器,默认使用Home控制器;若省略动作,默认使用Index动作;id参数为可选,允许使用无参数的动作方法。大多数业务线(LOB)应用程序需要与持久化数据存储(如MicrosoftSQLServer)中的数</div> </li> <li><a href="/article/1948598783969390592.htm" title="OWIN简介" target="_blank">OWIN简介</a> <span class="text-muted"></span> <div>当然可以!下面是对OWIN(OpenWebInterfacefor.NET)的全面介绍,涵盖它的起源、架构、优点以及与ASP.NET的关系。什么是OWIN?OWIN(OpenWebInterfacefor.NET)是一个标准,定义了.NETWeb服务器与Web应用之间的解耦接口。✅官方定义:OWINisaspecificationthatdecoupleswebapplicationsfromwe</div> </li> <li><a href="/article/1948223616361492480.htm" title="jQuery攻略pdf" target="_blank">jQuery攻略pdf</a> <span class="text-muted">weixin_30725315</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/c%2Fc%2B%2B/1.htm">c/c++</a><a class="tag" taget="_blank" href="/search/ViewUI/1.htm">ViewUI</a> <div>下载地址:网盘下载内容简介······jQuery是目前应用最广泛的JavaScript框架之一,已经成为微软ASP.NET、VisualStudio和诺基亚WebRunTime等主流开发平台的重要组成部分。借助jQuery的魔力,数十行JavaScript代码可以被神奇地压缩成区区几行,诸多Web开发人员就是在那一瞬间深深迷恋上了这个方便快捷、功能完备的利器。本书从实际应用角度出发,介绍了使用j</div> </li> <li><a href="/article/1948090102056022016.htm" title="ASP.NET Core MVC Redis 缓存应用" target="_blank">ASP.NET Core MVC Redis 缓存应用</a> <span class="text-muted">郑小晨</span> <a class="tag" taget="_blank" href="/search/.NET/1.htm">.NET</a><a class="tag" taget="_blank" href="/search/Redis/1.htm">Redis</a><a class="tag" taget="_blank" href="/search/ASP.NET/1.htm">ASP.NET</a><a class="tag" taget="_blank" href="/search/Core/1.htm">Core</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>环境:ASP.NETCoreMVC,Redis-Win-x64-3.2.100本文介绍在ASP.NETCoreMVC中怎么用Redis缓存数据。1、启动Redis服务器,就是让我们的Redis跑起来,具体参照https://blog.csdn.net/u012835032/article/details/115438693。2、要在ASP.NETCoreMVC中用Redis需要做什么?参考http</div> </li> <li><a href="/article/1948087957416112128.htm" title="【ASP.NET Core】内存缓存(MemoryCache)原理、应用及常见问题解析" target="_blank">【ASP.NET Core】内存缓存(MemoryCache)原理、应用及常见问题解析</a> <span class="text-muted">ArabySide</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/ASP.NET/1.htm">ASP.NET</a><a class="tag" taget="_blank" href="/search/Core/1.htm">Core</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/core/1.htm">core</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a> <div>系列文章目录链接:【ASP.NETCore】REST与RESTful详解,从理论到实现链接:【ASP.NETCore】深入理解Controller的工作机制文章目录系列文章目录前言一、ASP.NETCore中的内存缓存——MemoryCache1.1内存缓存的结构1.2MemoryCache的注册1.3MemoryCache的配置项1.3.1缓存时间的过期策略1.3.2缓存的优先级1.4Memor</div> </li> <li><a href="/article/1948086444585185280.htm" title="【ASP.NET Core】ASP.NET Core中Redis分布式缓存的应用" target="_blank">【ASP.NET Core】ASP.NET Core中Redis分布式缓存的应用</a> <span class="text-muted">ArabySide</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/.NET/1.htm">.NET</a><a class="tag" taget="_blank" href="/search/Core/1.htm">Core</a><a class="tag" taget="_blank" href="/search/Redis/1.htm">Redis</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F%E7%BC%93%E5%AD%98/1.htm">分布式缓存</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/core/1.htm">core</a> <div>系列文章目录链接:【ASP.NETCore】REST与RESTful详解,从理论到实现链接:【ASP.NETCore】深入理解Controller的工作机制链接:【ASP.NETCore】内存缓存(MemoryCache)原理、应用及常见问题解析文章目录系列文章目录前言一、Redis1.1Redis简介1.2常用数据结构1.3Redis的持久化1.3.1RDB1.3.2AOF1.4常用应用场景1.</div> </li> <li><a href="/article/1948063252671950848.htm" title="可编程的文字处理引擎TX Text Control .NET Server for Windows Forms" target="_blank">可编程的文字处理引擎TX Text Control .NET Server for Windows Forms</a> <span class="text-muted">burningblog</span> <div>TXTextControl.NETServerforWindowsForms控件是一个完全可编程的,用于ASP.NET服务器环境与MicrosoftInternetExplorer的文字处理引擎。它的设计理念就是在服务器端集中文字处理过程。具体功能:直接在浏览器中以所见即所得方式编辑文档TXTextControl.NETServer为您提供了一个浏览器控件,通过它可以在微软IE中以进行所见即所得模</div> </li> <li><a href="/article/1947938587416784896.htm" title="Web创建网站登录页面" target="_blank">Web创建网站登录页面</a> <span class="text-muted">怎么还没吃饭啊</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>目录一、创建新窗体1.创建一个普通的ASP.NET空web网站2.创建login.aspx二、添加控件三、login.aspx页面中四、添加点击控件1.打开login.aspx页面源五、总结一、创建新窗体1.创建一个普通的ASP.NET空web网站新窗体自己命名为自己想要建立的名字,我就命名为一课一得了一定注意的是要选择一个空的应用程序用于创建ASP.NET应用程序的空项目模版2.创建login.</div> </li> <li><a href="/article/1947811899949248512.htm" title="ASP.NET Core与Confluent.Kafka深度整合:构建高性能Kafka生产者与消费者的终极指南" target="_blank">ASP.NET Core与Confluent.Kafka深度整合:构建高性能Kafka生产者与消费者的终极指南</a> <span class="text-muted">墨夶</span> <a class="tag" taget="_blank" href="/search/C%23%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%996/1.htm">C#学习资料6</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/linq/1.htm">linq</a> <div>Kafka在现代微服务架构中的量子跃迁在2025年的分布式系统战场上,ApacheKafka已经超越了传统的消息队列角色,成为微服务架构的神经中枢。本文将通过1200+行代码和深度技术解析,揭秘如何在ASP.NETCore中使用Confluent.Kafka实现工业级的Kafka生产者与消费者。我们将从底层原理到高阶技巧,带你构建可扩展、可观察的Kafka集成方案。第一章:环境准备与核心概念1.1</div> </li> <li><a href="/article/1947325551450583040.htm" title="基于ASP.Net Core 开发的纯BS结构的RoadFlow工作流平台" target="_blank">基于ASP.Net Core 开发的纯BS结构的RoadFlow工作流平台</a> <span class="text-muted"></span> <div>基于ASP.NetCore开发的纯BS结构的RoadFlow工作流平台RoadFlow是一款集成工作流引擎的ASP.NETCOREMVC快速开发框架,由从事多年工作流开发与实施的技术团队开发。该工作流平台是根据多年对企事业单位工作流应用经验总结而成,是一款符合于国情的工作流平台,特别适合于国内无标准,复杂多变的工作审批流转。拥有全浏览器兼容的可视化流程设计器、表单设计器、灵活精细的权限管理等先进设</div> </li> <li><a href="/article/1947277528825655296.htm" title=".NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!" target="_blank">.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!</a> <span class="text-muted">步、步、为营</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/r%E8%AF%AD%E8%A8%80/1.htm">r语言</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a> <div>.NET8ReleaseCandidate1(RC1)发布:ASP.NETCore重大改进来袭!近日,.NET8ReleaseCandidate1(RC1)正式发布,这是在今年晚些时候计划发布的最终.NET8版本之前的两个候选版本中的第一个。此版本包含了大部分计划中的功能和变更,可供开发者提前尝鲜。不过,部分领域(尤其是Blazor)仍有重大变更待完成,预计将在下一个.NET8候选版本中落地。新功</div> </li> <li><a href="/article/1946847593875173376.htm" title="C#使用Quartz.NET详细讲解" target="_blank">C#使用Quartz.NET详细讲解</a> <span class="text-muted">diaochejiang2761</span> <a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a> <div>C#使用Quartz.NET详细讲解Quartz.NET是一个开源的作业调度框架,是OpenSymphony的QuartzAPI的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。你曾经需要应用执行一个任务吗?这个</div> </li> <li><a href="/article/1946841665767534592.htm" title="ASP.NET Core Web API中实现缓存" target="_blank">ASP.NET Core Web API中实现缓存</a> <span class="text-muted">AitTech</span> <a class="tag" taget="_blank" href="/search/.NetCore/1.htm">.NetCore</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/.netcore/1.htm">.netcore</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>在.NET6中,你可以使用几种方式来实现缓存,但最直接的方法之一是使用ResponseCaching中间件或自定义的ActionFilterAttribute(动作过滤器)。1.使用ResponseCaching中间件ASP.NETCore提供了一个内置的ResponseCaching中间件,它可以很容易地配置来缓存HTTP响应。这对于静态内容和一些动态内容(如基于查询参数的响应)非常有用。首先,</div> </li> <li><a href="/article/1946839268328534016.htm" title="本地开发用ASP.NET Core Web API项目创建及测试" target="_blank">本地开发用ASP.NET Core Web API项目创建及测试</a> <span class="text-muted">way_hj</span> <a class="tag" taget="_blank" href="/search/web%E5%BC%80%E5%8F%91/1.htm">web开发</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>1.服务端代码(C#)1.1创建ASP.NETCoreWebAPI项目打开VisualStudio2022。选择“创建新项目”。选择“ASP.NETCoreWebAPI”模板,点击“下一步”。输入项目名称(如OracleApi),选择项目位置,点击“创建”。1.2安装Oracle数据库依赖使用NuGet管理包工具在项目中安装Oracle数据库的EFCore依赖:Oracle.EntityFrame</div> </li> <li><a href="/article/1946828299137249280.htm" title="ASP.NET Core Web API 内存缓存(IMemoryCache)入门指南" target="_blank">ASP.NET Core Web API 内存缓存(IMemoryCache)入门指南</a> <span class="text-muted">王维志</span> <a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/webapi/1.htm">webapi</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a> <div>在WebAPI开发中,频繁访问数据库或第三方服务可能会带来性能瓶颈。为了提升接口响应速度并减轻后端压力,使用缓存是非常有效的优化手段。本文将带你快速上手ASP.NETCore提供的内存缓存(IMemoryCache),无需安装额外库,轻量、简单、适合中小项目什么是IMemoryCache?IMemoryCache是ASP.NETCore自带的缓存机制,使用服务器内存来存储数据对象,单机部署即可使用</div> </li> <li><a href="/article/1946555180791164928.htm" title="IIS部署ASP.Net Core 遇坑 502.记录" target="_blank">IIS部署ASP.Net Core 遇坑 502.记录</a> <span class="text-muted">DemonTutor</span> <div>IIS部署ASP.NetCore502.5错误和解决在Win2008的机器上部署ASP.NetCore程序,老是提示502.5错误。已经安装了MicrosoftVisualC++2015Redistributable.NETCoreWindowsServerHostingbundle对应版本的.NetCoreSDK,但程序就是跑不起来。出错截图直接使用dotnet命令程序是可以正常运行的,说明环境</div> </li> <li><a href="/article/1946532883476836352.htm" title="C#与Web开发:ASP.NET Core MVC框架" target="_blank">C#与Web开发:ASP.NET Core MVC框架</a> <span class="text-muted">墨瑾轩</span> <a class="tag" taget="_blank" href="/search/%E4%B8%80%E8%B5%B7%E5%AD%A6%E5%AD%A6C%23%E3%80%90%E4%B8%80%E3%80%91/1.htm">一起学学C#【一】</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a> <div>关注墨瑾轩,带你探索编程的奥秘!超萌技术攻略,轻松晋级编程高手技术宝库已备好,就等你来挖掘订阅墨瑾轩,智趣学习不孤单即刻启航,编程之旅更有趣引言嗨,小伙伴们!今天我们要聊的是一个超级有趣的主题——ASP.NETCoreMVC。如果你对C#还不熟悉,那么可以把它想象成一种既强大又灵活的语言,适合用来编写各种各样的应用程序。而ASP.NETCoreMVC呢?它是一种基于C#的现代Web开发框架,能够帮</div> </li> <li><a href="/article/1943656810909069312.htm" title="《从依赖纠缠到接口协作:ASP.NET Core注入式开发指南》" target="_blank">《从依赖纠缠到接口协作:ASP.NET Core注入式开发指南》</a> <span class="text-muted"></span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>在C#的ASP.NETCore开发中,依赖注入绝非简单的技术技巧,而是重构代码关系的底层逻辑。它像一套隐形的神经网络,让程序模块摆脱硬编码的束缚,在运行时实现动态连接,从而为系统注入可测试、可进化的核心生命力。理解其深层价值,需要穿透"服务注册与获取"的表层操作,触及它对软件设计哲学的重塑。依赖注入的本质,是对"依赖关系"的去中心化治理。传统开发中,模块间的依赖如同藤蔓缠绕的树木,一个组件直接创建</div> </li> <li><a href="/article/1942898804898459648.htm" title="【.NET】2024年ASP.NET Core开发者技能图谱:从基础到进阶的全景指南" target="_blank">【.NET】2024年ASP.NET Core开发者技能图谱:从基础到进阶的全景指南</a> <span class="text-muted">JosieBook</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Java%E5%85%A8%E6%A0%88/1.htm">Java全栈</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>前言在.NET生态快速发展的今天,ASP.NETCore已成为构建高性能、跨平台Web应用的首选框架。无论是初入职场的开发者,还是希望技术升级的资深工程师,清晰的技能体系都是持续成长的核心。本文基于2024年最新ASP.NETCore开发者技能图谱,带您系统梳理从基础到架构师的能力框架,助您在技术浪潮中找准方向。大类细分项具体内容ASP.NETCoreBasics(ASP.NETCore基础)C#</div> </li> <li><a href="/article/1942845230625648640.htm" title="CKEditor中粘贴复杂公式的最佳实践是什么?" target="_blank">CKEditor中粘贴复杂公式的最佳实践是什么?</a> <span class="text-muted">M_Snow</span> <a class="tag" taget="_blank" href="/search/umeditor%E7%B2%98%E8%B4%B4word/1.htm">umeditor粘贴word</a><a class="tag" taget="_blank" href="/search/ueditor%E7%B2%98%E8%B4%B4word/1.htm">ueditor粘贴word</a><a class="tag" taget="_blank" href="/search/ueditor%E5%A4%8D%E5%88%B6word/1.htm">ueditor复制word</a><a class="tag" taget="_blank" href="/search/ueditor%E4%B8%8A%E4%BC%A0word%E5%9B%BE%E7%89%87/1.htm">ueditor上传word图片</a><a class="tag" taget="_blank" href="/search/ueditor%E5%AF%BC%E5%85%A5word/1.htm">ueditor导入word</a><a class="tag" taget="_blank" href="/search/ueditor%E5%AF%BC%E5%85%A5pdf/1.htm">ueditor导入pdf</a><a class="tag" taget="_blank" href="/search/ueditor%E5%AF%BC%E5%85%A5ppt/1.htm">ueditor导入ppt</a> <div>要求:开源,免费,技术支持编辑器:ckeditor前端:vue2,vue3.vue-cli后端:asp,java,jsp,springboot,php,asp.net,.netcore功能:导入Word,导入Excel,导入PPT(PowerPoint),导入PDF,复制粘贴word,导入微信公众号内容,web截屏平台:Windows,macOS,Linux,RedHat,Ubuntu,CentO</div> </li> <li><a href="/article/1942297838801186816.htm" title="ASP.NET Core vs ASP.NET:架构革命与性能飞跃的终极指南——从0到1的8大秘诀!" target="_blank">ASP.NET Core vs ASP.NET:架构革命与性能飞跃的终极指南——从0到1的8大秘诀!</a> <span class="text-muted">墨夶</span> <a class="tag" taget="_blank" href="/search/C%23%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/1.htm">C#学习资料</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>**ASP.NETCore的架构革命与性能优化实战**第一阶段:架构对比——从“城堡”到“积木”1.1传统ASP.NET的“城堡”式架构//旧版ASP.NETWebForms典型结构publicclassGlobal:HttpApplication{voidApplication_Start(){RouteTable.Routes.Add(newRoute("...",newPageRouteHa</div> </li> <li><a href="/article/1941987184982683648.htm" title="C#安装使用教程" target="_blank">C#安装使用教程</a> <span class="text-muted">小奇JAVA面试</span> <a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/1.htm">安装使用教程</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、C#简介C#(读作C-Sharp)是微软开发的现代化、面向对象的编程语言,运行在.NET平台之上。它语法简洁、安全,广泛用于桌面应用、Web开发、游戏开发(Unity)以及跨平台开发。二、C#应用场景Windows桌面应用程序(WinForms、WPF)Web应用(ASP.NET)游戏开发(Unity3D)移动开发(Xamarin、MAUI)云服务、API开发控制台程序、自动化工具三、安装开发</div> </li> <li><a href="/article/1941985672860594176.htm" title="ASP.NET Web程序设计——WebPages" target="_blank">ASP.NET Web程序设计——WebPages</a> <span class="text-muted">勤奋的菜鸟a</span> <a class="tag" taget="_blank" href="/search/ASP.NET/1.htm">ASP.NET</a><a class="tag" taget="_blank" href="/search/web%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E5%B0%8F%E7%AC%94%E8%AE%B0/1.htm">web程序设计小笔记</a><a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a> <div>概述:移动互联网(MobileInternet,简称MI)是一种通过智能移动终端,采用移动无线通信方式获取业务和服务的新兴业务移动互联网被称为下一代互联网Web3.0移动互联网具有几个鲜明的特性:(1)便捷性和便携性(2)网络的局限性(3)即时性和精确性ASP.NETWebForms技术带来的负面效应:(1)由于控件封装了很多东西,开发者很难了解这背后的HTML是如何运作的;(2)容易得到一个包含</div> </li> <li><a href="/article/1941983782642970624.htm" title="ASP.NET Web Pages - 教程" target="_blank">ASP.NET Web Pages - 教程</a> <span class="text-muted">samFuB</span> <a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>ASP.NET是一个使用HTML、CSS、JavaScript和服务器脚本创建网页和网站的开发框架。ASP.NET支持三种不同的开发模式:WebPages(Web页面)、MVC(ModelViewController模型-视图-控制器)、WebForms(Web窗体):本教程介绍WebPages。WebPagesMVCWebForms从何入手?多数开发人员学习一个新技术,是从查看运行实例开始的。通</div> </li> <li><a href="/article/1941982648423477248.htm" title="ASP.NET Web Pages 教程:从入门到精通" target="_blank">ASP.NET Web Pages 教程:从入门到精通</a> <span class="text-muted">KrDebugging</span> <a class="tag" taget="_blank" href="/search/asp.net/1.htm">asp.net</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E5%AD%A6%E4%B9%A0/1.htm">编程学习</a> <div>ASP.NETWebPages是一种用于构建动态网页的技术,它结合了传统的HTML、CSS和JavaScript,以及强大的服务器端编程语言C#。本教程将带您逐步学习ASP.NETWebPages的基础知识,并通过示例代码演示如何创建交互性强、功能丰富的网页应用程序。环境设置在开始学习ASP.NETWebPages之前,您需要进行以下环境设置:安装VisualStudio:您可以从Microsof</div> </li> <li><a href="/article/1941661708971995136.htm" title="ASP.NET MVC 与 ASP.NET Core MVC:架构演进与技术对比" target="_blank">ASP.NET MVC 与 ASP.NET Core MVC:架构演进与技术对比</a> <span class="text-muted"></span> <div>在当今数字化时代,构建高效、可扩展且易于维护的Web应用程序已成为开发人员的核心任务之一。ASP.NETMVC和ASP.NETCoreMVC作为微软在Web开发领域的两大重要框架,为开发者提供了强大的工具来实现这一目标。然而,随着技术的不断演进,这两个框架在设计理念、架构、性能以及生态系统等方面存在着显著差异。对于开发者来说,理解它们之间的区别至关重要,这不仅有助于选择适合项目的框架,还能提升开发</div> </li> <li><a href="/article/1941533770360352768.htm" title="构建ASP.NET Web应用中的高效日期选择功能" target="_blank">构建ASP.NET Web应用中的高效日期选择功能</a> <span class="text-muted">金融先生-Frank</span> <div>本文还有配套的精品资源,点击获取简介:ASP.NET框架为Web应用程序开发提供了强大的服务器控件,其中日期选择控件让网页用户能够方便地进行日期选择。本文深入解析了ASP.NET内置的日期选择控件以及JavaScript控件的集成和使用。介绍了如何使用asp:Calendar和asp:TextBox配合asp:CalendarExtender来创建交互式的日期选择体验。此外,还探讨了JavaScr</div> </li> <li><a href="/article/49.htm" title="辗转相处求最大公约数" target="_blank">辗转相处求最大公约数</a> <span class="text-muted">沐刃青蛟</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E6%BC%8F%E6%B4%9E/1.htm">漏洞</a> <div>无言面对”江东父老“了,接触编程一年了,今天发现还不会辗转相除法求最大公约数。惭愧惭愧!   为此,总结一下以方便日后忘了好查找。   1.输入要比较的两个数a,b   忽略:2.比较大小(因为后面要的是大的数对小的数做%操作)   3.辗转相除(用循环不停的取余,如a%b,直至b=0)   4.最后的a为两数的最大公约数 &</div> </li> <li><a href="/article/176.htm" title="F5负载均衡会话保持技术及原理技术白皮书" target="_blank">F5负载均衡会话保持技术及原理技术白皮书</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/F5/1.htm">F5</a><a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a> <div>一.什么是会话保持?        在大多数电子商务的应用系统或者需要进行用户身份认证的在线系统中,一个客户与服务器经常经过好几次的交互过程才能完成一笔交易或者是一个请求的完成。由于这几次交互过程是密切相关的,服务器在进行这些交互过程的某一个交互步骤时,往往需要了解上一次交互过程的处理结果,或者上几步的交互过程结果,服务器进行下</div> </li> <li><a href="/article/303.htm" title="Object.equals方法:重载还是覆盖" target="_blank">Object.equals方法:重载还是覆盖</a> <span class="text-muted">Cwind</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/generics/1.htm">generics</a><a class="tag" taget="_blank" href="/search/override/1.htm">override</a><a class="tag" taget="_blank" href="/search/overload/1.htm">overload</a> <div>本文译自StackOverflow上对此问题的讨论。 原问题链接   在阅读Joshua Bloch的《Effective Java(第二版)》第8条“覆盖equals时请遵守通用约定”时对如下论述有疑问: “不要将equals声明中的Object对象替换为其他的类型。程序员编写出下面这样的equals方法并不鲜见,这会使程序员花上数个小时都搞不清它为什么不能正常工作:” pu</div> </li> <li><a href="/article/430.htm" title="初始线程" target="_blank">初始线程</a> <span class="text-muted">15700786134</span> <div>      暑假学习的第一课是讲线程,任务是是界面上的一条线运动起来。            既然是在界面上,那必定得先有一个界面,所以第一步就是,自己的类继承JAVA中的JFrame,在新建的类中写一个界面,代码如下: public class ShapeFr</div> </li> <li><a href="/article/557.htm" title="Linux的tcpdump" target="_blank">Linux的tcpdump</a> <span class="text-muted">被触发</span> <a class="tag" taget="_blank" href="/search/tcpdump/1.htm">tcpdump</a> <div>用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支 持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 实用命令实例 默认启动 tcpdump 普通情况下,直</div> </li> <li><a href="/article/684.htm" title="安卓程序listview优化后还是卡顿" target="_blank">安卓程序listview优化后还是卡顿</a> <span class="text-muted">肆无忌惮_</span> <a class="tag" taget="_blank" href="/search/ListView/1.htm">ListView</a> <div>最近用eclipse开发一个安卓app,listview使用baseadapter,里面有一个ImageView和两个TextView。使用了Holder内部类进行优化了还是很卡顿。后来发现是图片资源的问题。把一张分辨率高的图片放在了drawable-mdpi文件夹下,当我在每个item中显示,他都要进行缩放,导致很卡顿。解决办法是把这个高分辨率图片放到drawable-xxhdpi下。 &nb</div> </li> <li><a href="/article/811.htm" title="扩展easyUI tab控件,添加加载遮罩效果" target="_blank">扩展easyUI tab控件,添加加载遮罩效果</a> <span class="text-muted">知了ing</span> <a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a> <div>(function () { $.extend($.fn.tabs.methods, { //显示遮罩 loading: function (jq, msg) { return jq.each(function () { var panel = $(this).tabs(&</div> </li> <li><a href="/article/938.htm" title="gradle上传jar到nexus" target="_blank">gradle上传jar到nexus</a> <span class="text-muted">矮蛋蛋</span> <a class="tag" taget="_blank" href="/search/gradle/1.htm">gradle</a> <div>原文地址: https://docs.gradle.org/current/userguide/maven_plugin.html configurations {     deployerJars } dependencies {     deployerJars "org.apache.maven.wagon</div> </li> <li><a href="/article/1065.htm" title="千万条数据外网导入数据库的解决方案。" target="_blank">千万条数据外网导入数据库的解决方案。</a> <span class="text-muted">alleni123</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>从某网上爬了数千万的数据,存在文本中。 然后要导入mysql数据库。 悲剧的是数据库和我存数据的服务器不在一个内网里面。。 ping了一下, 19ms的延迟。 于是下面的代码是没用的。 ps = con.prepareStatement(sql); ps.setString(1, info.getYear())............; ps.exec</div> </li> <li><a href="/article/1192.htm" title="JAVA IO InputStreamReader和OutputStreamReader" target="_blank">JAVA IO InputStreamReader和OutputStreamReader</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/JAVA.io%E6%93%8D%E4%BD%9C+%E5%AD%97%E7%AC%A6%E6%B5%81/1.htm">JAVA.io操作 字符流</a> <div>这是第三篇关于java.io的文章了,从开始对io的不了解-->熟悉--->模糊,是这几天来对文件操作中最大的感受,本来自己认为的熟悉了的,刚刚在回想起前面学的好像又不是很清晰了,模糊对我现在或许是最好的鼓励 我会更加的去学 加油!: JAVA的API提供了另外一种数据保存途径,使用字符流来保存的,字符流只能保存字符形式的流   字节流和字符的难点:a,怎么将读到的数据</div> </li> <li><a href="/article/1319.htm" title="MO、MT解读" target="_blank">MO、MT解读</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/GSM/1.htm">GSM</a> <div>MO= Mobile originate,上行,即用户上发给SP的信息。MT= Mobile Terminate,下行,即SP端下发给用户的信息; 上行:mo提交短信到短信中心下行:mt短信中心向特定的用户转发短信,你的短信是这样的,你所提交的短信,投递的地址是短信中心。短信中心收到你的短信后,存储转发,转发的时候就会根据你填写的接收方号码寻找路由,下发。在彩信领域是一样的道理。下行业务:由SP</div> </li> <li><a href="/article/1446.htm" title="五个JavaScript基础问题" target="_blank">五个JavaScript基础问题</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/call/1.htm">call</a><a class="tag" taget="_blank" href="/search/apply/1.htm">apply</a><a class="tag" taget="_blank" href="/search/this/1.htm">this</a><a class="tag" taget="_blank" href="/search/Hoisting/1.htm">Hoisting</a> <div>下面是五个关于前端相关的基础问题,但却很能体现JavaScript的基本功底。 问题1:Scope作用范围 考虑下面的代码:  (function() { var a = b = 5; })(); console.log(b); 什么会被打印在控制台上?  回答:         上面的代码会打印 5。 &nbs</div> </li> <li><a href="/article/1573.htm" title="【Thrift二】Thrift Hello World" target="_blank">【Thrift二】Thrift Hello World</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Hello+world/1.htm">Hello world</a> <div>本篇,不考虑细节问题和为什么,先照葫芦画瓢写一个Thrift版本的Hello World,了解Thrift RPC服务开发的基本流程   1. 在Intellij中创建一个Maven模块,加入对Thrift的依赖,同时还要加上slf4j依赖,如果不加slf4j依赖,在后面启动Thrift Server时会报错 <dependency> </div> </li> <li><a href="/article/1700.htm" title="【Avro一】Avro入门" target="_blank">【Avro一】Avro入门</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/%E5%85%A5%E9%97%A8/1.htm">入门</a> <div>本文的目的主要是总结下基于Avro Schema代码生成,然后进行序列化和反序列化开发的基本流程。需要指出的是,Avro并不要求一定得根据Schema文件生成代码,这对于动态类型语言很有用。   1. 添加Maven依赖   <?xml version="1.0" encoding="UTF-8"?> <proj</div> </li> <li><a href="/article/1827.htm" title="安装nginx+ngx_lua支持WAF防护功能" target="_blank">安装nginx+ngx_lua支持WAF防护功能</a> <span class="text-muted">ronin47</span> <div>需要的软件:LuaJIT-2.0.0.tar.gz                   nginx-1.4.4.tar.gz          &nb</div> </li> <li><a href="/article/1954.htm" title="java-5.查找最小的K个元素-使用最大堆" target="_blank">java-5.查找最小的K个元素-使用最大堆</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> import java.util.Arrays; import java.util.Random; public class MinKElement { /** * 5.最小的K个元素 * I would like to use MaxHeap. * using QuickSort is also OK */ public static void</div> </li> <li><a href="/article/2081.htm" title="TCP的TIME-WAIT" target="_blank">TCP的TIME-WAIT</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/socket/1.htm">socket</a> <div>原文连接: http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html 以下为对原文的阅读笔记 说明: 主动关闭的一方称为local end,被动关闭的一方称为remote end 本地IP、本地端口、远端IP、远端端口这一“四元组”称为quadruplet,也称为socket 1、TIME_WA</div> </li> <li><a href="/article/2208.htm" title="jquery ajax 序列化表单" target="_blank">jquery ajax 序列化表单</a> <span class="text-muted">coder_xpf</span> <a class="tag" taget="_blank" href="/search/Jquery+ajax+%E5%BA%8F%E5%88%97%E5%8C%96/1.htm">Jquery ajax 序列化</a> <div>   checkbox 如果不设定值,默认选中值为on;设定值之后,选中则为设定的值   <input type="checkbox" name="favor" id="favor" checked="checked"/> $("#favor&quo</div> </li> <li><a href="/article/2335.htm" title="Apache集群乱码和最高并发控制" target="_blank">Apache集群乱码和最高并发控制</a> <span class="text-muted">cuisuqiang</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E5%8F%91/1.htm">并发</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4/1.htm">集群</a><a class="tag" taget="_blank" href="/search/%E4%B9%B1%E7%A0%81/1.htm">乱码</a> <div>都知道如果使用Http访问,那么在Connector中增加URIEncoding即可,其实使用AJP时也一样,增加useBodyEncodingForURI和URIEncoding即可。 最大连接数也是一样的,增加maxThreads属性即可,如下,配置如下: <Connector maxThreads="300" port="8019" prot</div> </li> <li><a href="/article/2462.htm" title="websocket" target="_blank">websocket</a> <span class="text-muted">dalan_123</span> <a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a> <div>一、低延迟的客户端-服务器 和 服务器-客户端的连接 很多时候所谓的http的请求、响应的模式,都是客户端加载一个网页,直到用户在进行下一次点击的时候,什么都不会发生。并且所有的http的通信都是客户端控制的,这时候就需要用户的互动或定期轮训的,以便从服务器端加载新的数据。   通常采用的技术比如推送和comet(使用http长连接、无需安装浏览器安装插件的两种方式:基于ajax的长</div> </li> <li><a href="/article/2589.htm" title="菜鸟分析网络执法官" target="_blank">菜鸟分析网络执法官</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>  最近在论坛上看到很多贴子在讨论网络执法官的问题。菜鸟我正好知道这回事情.人道"人之患好为人师" 手里忍不住,就写点东西吧. 我也很忙.又没有MM,又没有MONEY....晕倒有点跑题. OK,闲话少说,切如正题. 要了解网络执法官的原理. 就要先了解局域网的通信的原理. 前面我们看到了.在以太网上传输的都是具有以太网头的数据包. </div> </li> <li><a href="/article/2716.htm" title="Android相对布局属性全集" target="_blank">Android相对布局属性全集</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>RelativeLayout布局android:layout_marginTop="25dip" //顶部距离android:gravity="left" //空间布局位置android:layout_marginLeft="15dip //距离左边距 // 相对于给定ID控件android:layout_above 将该控件的底部置于给定ID的</div> </li> <li><a href="/article/2843.htm" title="Tomcat内存设置详解" target="_blank">Tomcat内存设置详解</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/tomcat%E5%86%85%E5%AD%98%E8%AE%BE%E7%BD%AE/1.htm">tomcat内存设置</a> <div>Java内存溢出详解   一、常见的Java内存溢出有以下三种:   1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。 可以利用JVM提</div> </li> <li><a href="/article/2970.htm" title="Java6 JVM参数选项" target="_blank">Java6 JVM参数选项</a> <span class="text-muted">greatwqs</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/HotSpot/1.htm">HotSpot</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/jvm%E5%8F%82%E6%95%B0/1.htm">jvm参数</a><a class="tag" taget="_blank" href="/search/JVM+Options/1.htm">JVM Options</a> <div>Java 6 JVM参数选项大全(中文版)   作者:Ken Wu Email: ken.wug@gmail.com 转载本文档请注明原文链接 http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm!   本文是基于最新的SUN官方文档Java SE 6 Hotspot VM Opt</div> </li> <li><a href="/article/3097.htm" title="weblogic创建JMC" target="_blank">weblogic创建JMC</a> <span class="text-muted">i5land</span> <a class="tag" taget="_blank" href="/search/weblogic/1.htm">weblogic</a><a class="tag" taget="_blank" href="/search/jms/1.htm">jms</a> <div>进入 weblogic控制太 1.创建持久化存储 --Services--Persistant Stores--new--Create FileStores--name随便起--target默认--Directory写入在本机建立的文件夹的路径--ok 2.创建JMS服务器 --Services--Messaging--JMS Servers--new--name随便起--Pers</div> </li> <li><a href="/article/3224.htm" title="基于 DHT 网络的磁力链接和BT种子的搜索引擎架构" target="_blank">基于 DHT 网络的磁力链接和BT种子的搜索引擎架构</a> <span class="text-muted">justjavac</span> <a class="tag" taget="_blank" href="/search/DHT/1.htm">DHT</a> <div>上周开发了一个磁力链接和 BT 种子的搜索引擎 {Magnet & Torrent},本文简单介绍一下主要的系统功能和用到的技术。 系统包括几个独立的部分: 使用 Python 的 Scrapy 框架开发的网络爬虫,用来爬取磁力链接和种子; 使用 PHP CI 框架开发的简易网站; 搜索引擎目前直接使用的 MySQL,将来可以考虑使</div> </li> <li><a href="/article/3351.htm" title="sql添加、删除表中的列" target="_blank">sql添加、删除表中的列</a> <span class="text-muted">macroli</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>添加没有默认值:alter table Test add BazaarType char(1) 有默认值的添加列:alter table Test add BazaarType char(1) default(0) 删除没有默认值的列:alter table Test drop COLUMN BazaarType 删除有默认值的列:先删除约束(默认值)alter table Test DRO</div> </li> <li><a href="/article/3478.htm" title="PHP中二维数组的排序方法" target="_blank">PHP中二维数组的排序方法</a> <span class="text-muted">abc123456789cba</span> <a class="tag" taget="_blank" href="/search/%E6%8E%92%E5%BA%8F/1.htm">排序</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">二维数组</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a> <div><?php/*** @package     BugFree* @version     $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $*** Sort an two-dimension array by some level </div> </li> <li><a href="/article/3605.htm" title="hive优化之------控制hive任务中的map数和reduce数" target="_blank">hive优化之------控制hive任务中的map数和reduce数</a> <span class="text-muted">superlxw1234</span> <a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a><a class="tag" taget="_blank" href="/search/hive%E4%BC%98%E5%8C%96/1.htm">hive优化</a> <div>一、    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务。 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);2. </div> </li> <li><a href="/article/3732.htm" title="Spring Boot 1.2.4 发布" target="_blank">Spring Boot 1.2.4 发布</a> <span class="text-muted">wiselyman</span> <a class="tag" taget="_blank" href="/search/spring+boot/1.htm">spring boot</a> <div>Spring Boot 1.2.4已于6.4日发布,repo.spring.io and Maven Central可以下载(推荐使用maven或者gradle构建下载)。   这是一个维护版本,包含了一些修复small number of fixes,建议所有的用户升级。   Spring Boot 1.3的第一个里程碑版本将在几天后发布,包含许多</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>