本文章是由機器翻譯。

服務站台

建立及使用 Web 摘要

Jon Flanders

可從 MSDN 程式庫 的程式碼下載
瀏覽線上的程式碼

內容

網頁摘要
WCF 和摘要
摘要結構
公開資料餵送
實作送紙
AtomPub
使用摘要

1 月 2009 問題MSDN Magazine我會討論使用 Representational 狀態傳輸 (REST) 為架構,來建置用戶端與伺服器應用程式的基本概念。我也開始查看如何建置在 Microsoft.NET Framework 3.5 中使用 Windows Communication Foundation (WCF) 功能這類應用程式。

這個月,我將討論一些其他的 Web 摘要 WCF 的功能,只因為的基底的支援已啟用。讀取先前時服務站台的資料行也會協助您瞭解這個、 您可以安全地讀取一個沒有給您自己做任何損害,(雖然有一些知識庫 」 的 WCF REST 基本很有用)。

網頁摘要,讓應用程式從全球資訊網中提取資訊幾乎十年已經解決。傳統上,用來公開文章和部落格的資訊,摘要現在通常用來公開其他類型的資料以及架構的簡易性。

摘要會是直接透過 HTTP URI 公開 XML 資料。摘要讀取器是負責輪詢時間間隔的 URI,並再處理擷取的資料。讀取時,它是用來公開資料的人力摘要的資料的應用程式會通知使用者的可用新的資料。在的情況下的自動送紙 (這可能是任何應用程式程式碼) 的讀取器,通常是某些應用程式的動作就會觸發新的資料擷取的。

考慮許多的摘要公開的部落格的資料為何這是建置服務的相關資料行的主題?餵送的簡易性公開的資料格式,加上餵送讀取器 (和程式庫來剖析摘要) 的普及導致許多其他類型的摘要為公開的資料。ADO.NET 資料服務,例如,會是完全使用餵送的技術建置已啟用服務的資料層 (特別使用建置在稱為原子的原子的最上層的標準發佈通訊協定 (AtomPub),這我在本文稍後會討論)。服務從其他公司的許多與 Microsoft Windows Azure 平台會公開更這的種方式其資料功能。

成功摘要的其中一個原因是它們就會使用已知和大部分的標準化的 XML 格式)。而不是使用自訂格式,每資料提供者,業界已採用兩個常見的餵送結構描述: 真正簡易新聞訂閱方式 (RSS) 和 Atom。RSS 是在兩種的格式舊],並廣泛採用的標準,有主導原子,雖然許多摘要仍然會公開 RSS 和 Atom 版本都。如果您正在建置一個服務,(特別是 RESTful 的服務,您會是也提供要考慮建置使用資料的摘要使用如果服務是讀取 / 寫入,服務會唯讀的] 或 [使用 AtomPub RSS 或 Atom。

WCF 和摘要

其基底支援建置 RESTful 端點的頂端,.NET Framework 3.5 中的 WCF 也會包含公開摘要的支援。您可以建立 WCF HTTP 型端點,並公開 (Expose) 使用其中一個常見的摘要的格式的摘要。在.NET Framework 的 3.5 SP1 的 WCF 會加入其他支援摘要,讓您輕鬆地實作支援 AtomPub 規格的端點。

我認為,其中一個不錯的功能,WCF 中摘要的支援是它摘要離開需要知道深層,原子] 或 [RSS 格式的詳細資料。WCF 將提供您,您用來建置泛型物件 (物件模型是更像原子,因為原子稍微更豐富的模型,比 RSS) 的圖形的物件模型。然後,您可以使用這個物件 Graph 的最上層,並將它傳遞至另一個的架構提供物件,稱為格式子 (Formatter)。格式子 (Formatter) 負責的序列化物件圖形資料,正確的摘要格式。這是如何您可以輕鬆地公開 RSS 和 Atom 從相同的端點,和它也隔離您未來的變更,以摘要的格式後將會需要的是新的格式子。您的工作是填入物件 Graph 的資料。基礎結構負責將您的資料轉換成正確的摘要格式。

摘要結構

之前我進一步先我討論一些摘要和它如何與 WCF 物件模型相關聯的結構。摘要若要是一個很簡單方法公開的資料 (請參閱 [圖 1 ) 集合。摘要 (一般) 包含標題、 描述、 已發行的日期,最後更新日期 / 時間,以及項目的集合。每一個這些項目是也相當簡單的資料,已發行的日期、 標題和內容。是否的部落格項目、 「 新聞 」 文件或一些其他的資訊片段,內容通常包含重要的資料。每個項目可以有超連結可以連結至個別項目或項目 (例如其資料,而非只是摘要的完整 HTML 頁面) 的其他表示。請參閱 [圖 1 。 餵送的視覺化表示

[圖 1 架構的資料餵送

假設我想要公開 MSDN Magazine 透過餵送的文件有關的資訊。首先,我必須決定要透過此摘要公開哪些資料。雖然有幾個選項,我決定實作這個範例中,為所有問題和 MSDN Magazine 中發行的文件的摘要。餵送讀取器會取得的更新程式時, 它會顯示每個發行成一個小型的一個個別項目的文件文件的摘要做為內容。

這個範例中,我要從我最後的欄的擴充程式碼,我建置 MSDN Magazine 資料提供泛型的 RESTful 服務端點。再次,您一定不需要返回,並閱讀該文件以瞭解這一個,但是並沒有為目的,如 [我的範例,我選擇這個特定案例,而且它實際上會適用於 RESTful 和 SOAP 架構 Web 服務。通常,摘要會是某項良好的實作詳細資料將新增到現有的服務。不錯的 WCF 棒是簡單若要將摘要的端點加入至任何服務在您建立與 WCF 不論整個服務是否 RESTful。

公開資料餵送

首先,我要執行的是擴充我的服務合約和定義来包含的作業,可以公開的摘要。我要執行這項操作,加入名為 GetIssuesFeed 我 IMSDNMagazineService 至新的方法 (請參閱 [圖 2 ) 的介面。

[圖 2 新增 GetIssuesFeed 方法

[ServiceContract]
public interface IMSDNMagazineService {
  [OperationContract]
  [WebGet(UriTemplate="/")]
  IssuesCollection GetAllIssues();

  [OperationContract]
  [WebGet(UriTemplate = "/feed?format={format}")]
  [ServiceKnownType(typeof(Atom10FeedFormatter))] 
  [ServiceKnownType(typeof(Rss20FeedFormatter))]
  SyndicationFeedFormatter GetIssuesFeed(string format);  

  [OperationContract]
  [WebGet(UriTemplate = "/{year}")]
  IssuesData GetIssuesByYear(string year);

  //remainder of interface commented for clarity
  ...
}

有件事,請注意,這個方法幾。先,傳回型別 SyndicationFeedFormatter,在 WCF 的一部分的摘要我參照先前一般為格式子 (Formatter) 的支援。它會參考我已填入資料,之基礎物件,並將會產生正確的 XML 摘要格式視餵送的物件的類型]。

請注意,其他事情將是您,WebGetAttribute,UriTemplate 屬性。這 WCF 表示哪些應該回應每個方法的 URI 或控制代碼。在此情況下是感興趣的是 GetIssuesFeed 方法具有一個 URI 範本是常值 (Literal):"/"餵送。GetIssuesByYear (這是泛型的摘要與 RESTful 方法) 有一個變數的路徑區段 (「 / {年 」) 的 URI 中。URI 剖析與路由機制,請將所有變成字串,因為它會出現這些兩個 UriTemplates 會有衝突。

UriTemplate 剖析 WCF 中的規則都需要常值 (Literal) 的相符項目將會符合變數相符項目之前。因此,如果在傳入 URI 以結束"/"餵送,它將路由傳送到 GetIssuesFeed,但該路徑區段的任何其他的 URI 會路由到 GetIssuesByYear。請注意我也使用查詢字串來表示的摘要格式用戶端要求。(我,特別是要求時,只有將傳回 RSS ; 否則,我也會傳回原子)。

在第三個 GetIssuesFeed 方法上感興趣的是 ServiceKnownTypeAttribute。這個屬性是 WCF,用來通知可能為它需要它才能正確地執行序列化) 的實際傳回值會傳遞傳回任何的值衍生類別的序列化 (Serialization) 層。在此情況下,我可能會想要傳回兩個的格式,並,需要兩個 ServiceKnownTypeAttribute 宣告每個參考適當衍生的 SyndicationFeedFormatter: AtomFeedFormatter 和 Rss20FeedFormatter。它是相當彰顯的類別名稱,但 AtomFeedFormatter 傳回摘要使用原子的格式,而且 Rss20FeedFormatter 傳回摘要使用 RSS 2.0 的格式。這是只是一般的 WCF 基礎結構,但您可能無法看過這項功能除非您已嘗試進行多型 (Polymorphism) WCF 之前傳回的值]。

實作送紙

呼的所有不實作中取得。實作是其實相當簡單,因為它只需要接受我的資料,有關的問題和文件,並將該的資料傳送至 WCF 物件模型。SyndicationFeedFormatter 不是以基礎物件模型 (請記住的物件,並格式化。名為 SyndicationFeed 型別周圍,物件模型中心 (請參閱 [圖 3 )。一個 SyndicationFeed 物件可以用於取得一個有效的 SyndicationFeedFormatter,而且它是保留到每個摘要項目的物件。項目會是 SyndicationFeed.items 集合的一部分。

[圖 3 SyndicationFeed 物件模型

雖然其模型針對稍微向 (使用作者和連結的集合,以及 SyndicationItem 上的 [內容] 和 [摘要] 屬性) 的原子 SyndicationFeed 物件模型會遵循在泛型的餵送的概念。[圖 4 ] 顯示實作 GetIssuesFeed 方法,在我的服務的程式碼。

[圖 4 GetIssuesFeed

public SyndicationFeedFormatter GetIssuesFeed(string format) {
  SyndicationFeedFormatter ret = null;
  SyndicationFeed myFeedData = new SyndicationFeed();
  myFeedData.Title = new TextSyndicationContent(
    "MSDN Magazine feed");
  Articles articles = GetAllArticles();

  SyndicationItem sitem = null;
  List<SyndicationItem> list = new List<SyndicationItem>();
  myFeedData.Items = list;
  SyndicationLink altLink = null;
  foreach (var item in articles) {
    sitem = new SyndicationItem {
      Title = new TextSyndicationContent(
        "MSDN Magazine Article: " + item.Title),
      Content = new XmlSyndicationContent(GenerateContent(item)),
      PublishDate = GetPublished(item),
      LastUpdatedTime = GetUpdated(item)
    };
    altLink = MakeLinkForArticle(item);
    sitem.Links.Add(altLink);
    list.Add(sitem);
  }
  ret = new Atom10FeedFormatter(myFeedData);
  return ret;
}

這是 SyndicationItems 的簡單的程式碼和以下相同的基本模式,所有摘要程式碼,這是 SyndicationItems 的建立一個 SyndicationFeed 物件]、 [適當,設定其屬性的 WCF 中建立清單後關聯,SyndicationFeed (這不完成的物件自動),填入 SyndicationItems 包含資料的清單上的清單,。 (您可以在從 MSDN Magazine網站下載完整的程式碼以便為求,我還沒有顯示所有的 Helper 方法在此,)

填入 SyndicationItem 屬性中會介紹的複雜性,視您是否計劃公開的 RSS 或 Atom (或兩者)。 但基本上它設定標題、 PublishedDate、 LastUpdatedDate 和內容的 [內容]。

另一件事来注意這個程式碼是 LastUpdatedTime 和 PublishDate 型別 DateTimeOffset,.NET Framework 3.5 來簡化使用實際的日期和時間以及時區中已加入新類型。

標題和內容則會有比您預期的可能有點不同。 標題的型別為 TextSyndicationContent,而且內容是文件 SyndicationContent 型別。 這些型別 (和其他主要衍生型別,XmlSyndicationContent) 用來管理不同部分的摘要的內容,但它們所包含的內容中有時候而有所不同。 舉例來說,SyndicationItem.content 屬性可能有純文字、 某些形式的 XML (即使 XHTML 或 HTML) 或某種二進位內容 (因此,UrlSyndicationContent 型別) 的連結。 需要支援所有這些不同類型的資料摘要的項目內的間接取值層 SyndicationContent。

一旦我有此餵送設定執行,我可以進行使用者代理程式要求的和 Internet Explorer 是快樂挑選餵送,並將允許訂閱 (如同任何餵送讀取器的使用者代理程式) 使用者。

向原子移動許多的站台及服務的另一個原因是因為 Atom 發佈通訊協定 (AtomPub)。 其中 Atom 摘要的格式 AtomPub 會是擷取、 建立,和更新資源資料規格。 這是一種規格,建立在 REST 的條件約束之上,因此一旦您了解 REST,是直接使用它。 因為大部分互動的完成原子的執行個體,格式是互動的也清楚地瞭解。

大部分的原子周圍的 AtomPub 中心摘要,但是兩個新的文件類型: 服務文件和類別。 在.NET Framework 3.5 SP1 會加入 AtomPub 透過支援這些新的文件類型的兩個新物件的支援。 (您可以實作與只是.NET Framework 3.5,AtomPub 但 SP1 新增功能可讓您的工作更容易)。

AtomPub 服務文件將是您,有關哪些工作區特定的 AtomPub 端點支援通知 「 使用者代理程式在中繼資料文件。 工作區會是真的是超連結至特定的 Atom 摘要的成員資源的集合。 服務文件也可以指定動作,例如哪些媒體類型的每個摘要支援 (例如影像或其他二進位檔案) 時, 都必須支援標準的原子項目所有摘要。

AtomPub 規格也會指定如何使用統一的介面,對每個摘要 (成員資源)。 您可以看到 [圖 5 ] 中的,這個對應。

[圖 5 AtomPub 的統一的介面的應用程式
資源 統一的介面方法 描述
服務文件 GET 一旦在使用者代理程式已知 URI,可透過 GET 擷取服務文件
類別的文件 GET 用來取得分類的表示
集合 GET 取得表示 — 原子餵送
集合 POST 建立新的原子項目
成員 GET 取得可以是個別的原子項目或二進位檔案的個別成員
成員 PUT 修改成員
成員 DELETE 刪除成員

由 SP1 加入型別會是 ServiceDocument (類似於 SyndicationItem) 」 和 「 AtomPub10ServiceDocumentFormatter (這是為 SyndicationFeedFormatter 相同目的)。 有也是名為 ResourceCollectionInfo 來表示服務文件中的每個集合型別。 這個型別有 ServiceDocument 有點類似 SyndicationFeed SyndicationItem,之間關係到關係,因為 ServiceDocument 保存到 ResourceCollectionInfos 產生服務文件本身的主要內容的清單。

若要支援我的端點 AtomPub,先我需要新增另一個方法到我的合約:

[OperationContract]
  [WebGet(UriTemplate = "/servicedoc")]
  AtomPub10ServiceDocumentFormatter GetServiceDoc();

然後我可以提供在實作,如 [圖 6 ] 所示中。 這將會產生 [圖 7 ] 所示,服務文件。

[圖 6 AtomPub 服務文件實作

public AtomPub10ServiceDocumentFormatter GetServiceDoc() {
  OutgoingWebResponseContext ctx =
    WebOperationContext.Current.OutgoingResponse;
  ctx.ContentType = "application/atomsvc+xml";
  AtomPub10ServiceDocumentFormatter ret = null;

  //create the ServiceDocument type
  ServiceDocument doc = new ServiceDocument();
  IncomingWebRequestContext ictx =
    WebOperationContext.Current.IncomingRequest;

  //set the BaseUri to the current request URI
  doc.BaseUri = ictx.UriTemplateMatch.RequestUri;

  //create a Collection of resources   
  List<ResourceCollectionInfo> resources =
     new List<ResourceCollectionInfo>();

  //create the Blog resource
  ResourceCollectionInfo mainBlog =
    new ResourceCollectionInfo("MSDNMagazine",
      new Uri("feed", UriKind.Relative));

  //add the Accepts for this resource
  //remember this is the default if no accepts if present
  mainBlog.Accepts.Add("application/atom+xml;type=entry");
  resources.Add(mainBlog);

  //create the Pictures resource
  ResourceCollectionInfo mainPictures =
    new ResourceCollectionInfo("Pictures",
      new Uri("pictures", UriKind.Relative));

  //add the Accepts for this resource
  mainPictures.Accepts.Add("image/png");
  mainPictures.Accepts.Add("image/jpeg");
  mainPictures.Accepts.Add("image/gif");
  resources.Add(mainPictures);

  //create the Workspace
  Workspace main = new Workspace("Main", resources);

  //add the Workspace to the Service Document
  doc.Workspaces.Add(main);

  //get the formatter
  ret = doc.GetFormatter()
    as AtomPub10ServiceDocumentFormatter;
  return ret;
}

[圖 7] 定義 「 服務

<?xml version="1.0" encoding="utf-8"?>
<service xml:base="http://localhost:1355/Issues.svc/servicedoc" 
  xmlns="http://www.w3.org/2007/app" 
  xmlns:a10="http://www.w3.org/2005/Atom">
  <app:workspace xmlns:app="http://www.w3.org/2007/app">
    <a10:title type="text">Main</a10:title>
    <app:collection href="feed">
      <a10:title type="text">MSDNMagazine</a10:title>
      <app:accept>application/atom+xml;type=entry</app:accept>
    </app:collection>
    <app:collection href="pictures">
      <a10:title type="text">Pictures</a10:title>
      <app:accept>image/png</app:accept>
      <app:accept>image/jpeg</app:accept>
      <app:accept>image/gif</app:accept>
    </app:collection>
  </app:workspace>
</service>

此服務的文件進行通訊沒有一個工作區名稱的主要有兩個集合。某個集合都有相對的 URI,摘要 」 和 「 的預設媒體類型作為其輸入 (媒體類型的原子項目) 的使用。其他集合會保留二進位檔案,特別 (受限制媒體類型所列) 的影像檔案中,與具有 URI 的 「 圖片。 指定此文件,在使用者代理程式可以輕易地與互動下列規則將在 [圖 5] 的 [我的 AtomPub 端點。

AtomPub 會是一種有用的標準,可套用至許多不同案例不只是部落格和相關的檔案 (例如影像)。

使用摘要

SyndicationFeed API 也可以在用戶端的使用摘要來使用。目前的各種摘要格式 (而且可能會有更多在未來) 設為使用自訂的程式碼,所以這是一個很棒的附加,.NET Framework 基底程式庫的重要工作。以下是一些簡單的程式碼會示範使用餵送:

string uri = "http://localhost:1355/Issues.svc/feed";
XmlReader xr = XmlReader.Create(uri);
SyndicationFeed feed = SyndicationFeed.Load(xr);
Console.WriteLine("Feed title:{0}",feed.Title.Text);
foreach (var item in feed.Items) {
  Console.WriteLine("Item {0}",item.Title.Text);
} 

標準許多公司都化 AtomPub 周圍儘建置服務和架構。ADO.NET 資料服務可用來 AtomPub 公開資料的實體。依次,ADO.NET 資料服務用於所有資料表、 部落格和 Microsoft Azure 佇列功能。Windows Live 服務使用 AtomPub 大部分的其公開 (Expose) 的服務。這裡的重點是即使您從任何您正在建置的應用程式不是公開原子或 AtomPub,機會很高您需要知道如何互動,並使用 AtomPub 服務,現在或某個在不久的未來。希望哪些我已經這裡您將會幫助您開始。

ADO.NET 資料服務 」 或 「 WCF 嗎?

服務和.NET Framework 3.5 兩者都提供輕鬆地公開 RESTful 產生標準相容的 Web 服務的方式摘要中 WCF 的 ADO.NET 資料。因此何時應該使用 ADO.NET 資料服務,何時應該使用內建的支援 WCF 中嗎?

WCF 提供功能公開,並在呼叫服務的端點。服務端點可能是標準與 WCF 3.5,SOAP 為基礎,或依照簡單的 RESTful 服務介面樣式。若要公開一個 RESTful 端點,您加註您的服務類別,與在 UriTemplate 方法用來定義資源識別項。URI,符合呼叫您的方法,傳入參數中,從範本中該範本] 結果。一組已加上註解的方法,您的類別會組成您的服務合約。

以 RSS 或 Atom 相容摘要,請從 WCF 服務傳回的結果,您建立在方法內 SyndicationFeed 物件包含 SyndicationItems 表示您要傳回的內容的清單。您再將該 SyndicationFeed SyndicationFeedFormatter,以適當的型別的建立,並傳回該 SyndicationFeedFormatter,從您的方法。

ADO.NET 資料服務會建置於 WCF,並將透過一個實體] 模型例如 Microsoft Entity Framework 或其他 IQueryable 的資料來源公開的模型中提供一個查詢的 REST-基礎端點。使用 ADO.NET 資料服務,模型會變成服務合約。透過標準 URI,除了服務根目錄和資源路徑包含查詢選項,例如篩選、 排序、 分頁和圖形的擴充,可以查詢該模型。此外,ADO.NET Data Services 還可提供控制的存取權限、 公開自訂服務作業以及自訂如何資源的存取 (例如,針對實作使用者為基礎的安全性) 透過查詢攔截的功能。

ADO.NET 資料服務支援 JSON 和 AtomPub 規格,包括執行插入,更新,並刪除對服務 (如允許) 透過標準的 HTTP 動詞命令。因此,您也可以從任何 HTTP 用戶端存取 ADO.NET 資料服務。

此外,Microsoft 隨附的 ADO.NET.NET 用戶端架構的資料服務用戶端、 Silverlight 和艾傑克斯,提供了強型別、 LINQ-基礎體驗查詢和更新資料的 ADO.NET 資料] 服務的端點 (該端點是否會為使用 ADO.NET 資料服務 」 或 「 自訂實作例如 Azure 表實作)。

因此如果要在資料來源 (例如的 ADO.NET 資料提供者或 IQueryable 來源 (包括記憶體中的集合) 和傳回結果,JSON 的 AtomPub 的相容格式,可透過簡單的 HTTP 用戶端或強型別的用戶端使用公開 REST-為基礎的查詢模型再 ADO.NET 資料服務提供最少的工作,大部分的功能。

另一方面,如果您要實作一組方法,手動製作摘要根據自訂應用程式的邏輯 WCF 中內建的功能輕鬆公開這些的方法,為 RESTful 服務能夠傳回餵送的 RSS 或 Atom-相容的格式,然後。

—Michael Pizzo 主要設計師,資料的程式設計

您問題或意見寄至sstation@Microsoft.com.

Jon Flanders 會是獨立的顧問、 喇叭和 Pluralsight 的講師。他,專長在 BizTalk Server、 Windows Workflow Foundation 和 Windows Communication Foundation。您可以與 Jon 在masteringbiztalk.com/blogs/jon.