首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

使用 OData 協定查詢 Windows 事件記錄:WCF Data Services 實戰

     編輯:關於.NET

前言

OData (Open Data Protocol) 為 Microsoft 推動的開放資料存取標準,基於 HTTP、AtomPub、JSON。本文示範以 WCF Data Services 搭配 Reflection Provider,將伺服器的 Windows 應用程式事件記錄發布為 OData 服務,客戶端可透過 LINQ 查詢。

架構概覽

  • 實體類別:LogEntry 對應事件記錄欄位,標記 [EntityPropertyMapping] 對應 Atom 標準元素 (Title、Summary、Updated)。
  • 資料來源:LogDataSource 實作 IQueryable<LogEntry> LogEntries,使用 System.Diagnostics.EventLog 讀取 Application 記錄,支援依來源過濾、最新 200 筆。
  • 服務類別:LogDataService : DataService<LogDataSource>,InitializeService 設定實體集存取權限、協定版本 (V2);CreateDataSource 從設定檔讀取來源名稱。

關鍵程式碼

LogEntry 實體

[EntityPropertyMapping("Source", SyndicationItemProperty.Title, SyndicationTextContentKind.Plaintext, true)]
[EntityPropertyMapping("Message", SyndicationItemProperty.Summary, SyndicationTextContentKind.Plaintext, true)]
[EntityPropertyMapping("TimeGenerated", SyndicationItemProperty.Updated, SyndicationTextContentKind.Plaintext, true)]
[DataServiceKey("EventID")]
public class LogEntry {
  public long EventID { get; set; }
  public string Category { get; set; }
  public string Message { get; set; }
  public DateTime TimeGenerated { get; set; }
  public string Source { get; set; }
}

LogDataSource (Reflection Provider)

public class LogDataSource {
  private string _source;
  public LogDataSource(string source) { _source = source; }
  public IQueryable<LogEntry> LogEntries {
    get { return GetEntries().AsQueryable().OrderBy(e => e.TimeGenerated); }
  }
  private IEnumerable<LogEntry> GetEntries() {
    var appLog = EventLog.GetEventLogs().FirstOrDefault(e => e.Log == "Application");
    var list = new List<LogEntry>();
    if (appLog != null) {
      foreach (EventLogEntry entry in appLog.Entries) {
        if (_source == null || entry.Source.Equals(_source, StringComparison.OrdinalIgnoreCase)) {
          list.Add(new LogEntry {
            Category = entry.Category,
            EventID = entry.InstanceId,
            Message = entry.Message,
            TimeGenerated = entry.TimeGenerated,
            Source = entry.Source
          });
        }
      }
    }
    return list.OrderByDescending(e => e.TimeGenerated).Take(200);
  }
}

LogDataService

public class LogDataService : DataService<LogDataSource> {
  public static void InitializeService(DataServiceConfiguration config) {
    config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
    config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
  }
  protected override LogDataSource CreateDataSource() {
    string source = ConfigurationManager.AppSettings["EventLogSource"];
    if (source == null) throw new ApplicationException("Missing EventLogSource appSetting");
    return new LogDataSource(source);
  }
}

客戶端消費

  1. Visual Studio 加入服務參考 產生 Proxy 類別。
  2. 可安裝 Open Data Protocol Visualizer 擴充套件視覺化檢視 OData 回應。
var ctx = new LogDataService.LogDataSource(new Uri("https://localhost:3399/LogDataService.svc/"));
foreach (var item in ctx.LogEntries) {
  Console.WriteLine($"來自 {item.Source} 事件 {item.EventID}, 內容 {item.Message}");
}

優勢總結

  • 資料來源彈性:資料庫、雲端、XML、EventLog 皆可,統一透過 WCF Data Services 發布。
  • 標準化查詢:客戶端使用 LINQ、$filter、$top、$skip 等 OData 查詢選項。
  • 跨平台:OData SDK 支援 .NET、Java、PHP、iPhone 等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved