XML 1OData开放数据协议是微软针对Google的GData推出的,旨在放开Web程序数据库格式标准化的绽开数据协议,微软以
OData 定义也依据 HTTP、AtomPub 和 JSON
的商,增强各种网页应用程序之间的数额兼容性,以供多种行使、服务与数码公司的音看。并且,微软曾正式生产了
OData SDK,包含了 .NET、Java、PHP、Palm WebOS 和 iPhone 的支撑。其中
.Net OData 客户端基于 Apache 授权开源。微软多款产品已经支持 OData 包括
SharePoint Server 2010, Excel 2010, Dynamics 等。

   微软先是替数据交换协议叫ODBC(开放数据库联网 Open Database
Connectivity),目前仍旧可见于window和linux的原生程序支付中,其目的是吧操作系统下之应用程序之间提供合之数量交互的API,是函数式的。之后,微软产了次替代:OLE
DB,带来了OOP式样的交互API,以及跨网络的数码交互的可能(通过DCOM),OLE
DB 标准的现实贯彻是同一组C++ API 函数,就像ODBC 标准被的ODBC API
一样,不同的是,OLE DB 的API 是抱COM 标准、基于对象的(ODBC API
则是简单的C API)。使用OLE DB API,可以编写能够访问符合OLE DB
标准的任何数据源的应用程序,也可编制针对某种特定数据存储的询问处理先后(Query
Processor)和游标引擎(Cursor Engine),因此OLE DB
标准其实是确定了数额使用者和提供者之间的相同种应用层的商议(Application-Level
Protocol)。在说计算时,web应用都是主流,程序要通过HTTP
Request来发表要求,通过HTTP Response来取结果,ODBC和OLE
DB都早已无法以。微软被是开了该第三代数据交互协议:OData开放数据协议。

  
以SOA的世界被,最关键的一个概念就是契约(contract)。在道计算的世界面临,有关通信的卓绝要紧之定义呢是契约。XML具有强对数据的描述能力,Atom格式和AtomPub都起在XML之上,在Google和微软的推动下,也一度变成规范。但是,Atom/AtomPub和ODBC/OLEDB这样的真的数据交互协议相互较,还有着根本上之供不应求:缺乏数据类型的求实讲述,降低了彼此性能。缺乏针对性数据查询的控制能力,比如返回特定的数额集合的间隔,或者说分页能力等等。微软基于EDM模型释出了:OData,这里为可看出Entity
Framework对于NHibernate这样的ORM的工具不同的韬略设想。

    在PDC大会上,微软宣告了一个代号为
“Dallas”的社区技术预览(CTP),由Windows Azure 和SQL
Azure构建的音讯服务,能够吃开发者和信息工作者在其他平台及使优质的老三方数据集和内容。“Dallas”也堪经过采取微软技术自助的商务智能和分析存储的数额集。Dallas所用的多少交互协议就是OData。

   以微软的解决方案被,是故WCF来拍卖所有程序中的通信,针对数据通信,WCF
Data Services自然是最好的精选。首先,WCF Data
Services是WCF服务,所以您得利用具有现有的WCF知识。其次,WCF Data
Services已经落实了OData拓扑,于是你得从事为您的数额格式在公的先后中的象征,而非是AtomPub/JSON这些真的当网络直达传递的数量格式。再有,WCF
Data
Services致力为数据传,而休是数额存储。你的数目好存放于另外职务:本地的数据库,云端的数据库,外部的web
services,xml文件,等等。无论数额是怎么来的,你还足以为此平等的方法来宣布/使用它们。

   下面我们尽管以WCF Data
Service将服务器的Windows应用程序日志向他公布。我们的应用程序可以将日记直接就描写于Windows的日志里,然后经过利用WCF
Data Service非常容易的尽管将日志想其他需要的用户公开。WCF Data
Service默认使用的是Entity Framework,使用Entity Framework参看文章WCF
Data Service
QuickStart,还有一个Reflection
Provider,可以支持就读的数据服务,这个例子就是以身作则使用Reflection
Provider,资料参看MSDN:http://msdn.microsoft.com/en-us/library/dd723653(VS.100).aspx,还足以自定义实现一个Provider,参看文章自定义Data
Service
Providers。

率先定义一个Windows日志的实业,类似于WCF的DataContract,这里用的凡EDM的映照:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Services.Common;

namespace ReflectionDataServiceDemo
{
    [EntityPropertyMappingAttribute(“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;
        }

    }

}

上面使用一个新特征Friendly
feeds
将数据映射到标准ATOM元素,其中DataServiceKey是绝无仅有一个必须的号,然后使用Reflection
Provider实现一个IQueryable接口的数据源:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Diagnostics;

namespace ReflectionDataServiceDemo
{
    public class LogDataSource
    {
        string source;

        public LogDataSource(string source)
        {
            this.source = source;
        }

        public LogDataSource()
        {
        }

        public IQueryable<LogEntry> LogEntries
        {
            get { return GetEntries().AsQueryable().OrderBy(e =>
e.TimeGenerated); }
        }

        private IEnumerable<LogEntry> GetEntries()
        {
            var applicationLog =
System.Diagnostics.EventLog.GetEventLogs().Where(e => e.Log ==
“Application”)
                .FirstOrDefault();

            var entries = new List<LogEntry>();

            if (applicationLog != null)
            {
                foreach (EventLogEntry entry in
applicationLog.Entries)
                {
                    if (source == null || entry.Source.Equals(source,
StringComparison.InvariantCultureIgnoreCase))
                    {
                        entries.Add(new LogEntry
                        {
                            Category = entry.Category,
                            EventID = entry.InstanceId,
                            Message = entry.Message,
                            TimeGenerated = entry.TimeGenerated,
                            Source = entry.Source,
                        });
                    }
                }
            }

            return entries.OrderByDescending(e => e.TimeGenerated)
                        .Take(200);
        }
    }

}

末补充加一个WCF Data
Service,代码非常之概括,主要的行事便是以上述数据源通过WCF Data
Service发布出去:

using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;
using System.Configuration;

namespace ReflectionDataServiceDemo
{
    public class LogDataService : DataService<LogDataSource >
    {
        // This method is called only once to initialize service-wide
policies.
        public static void InitializeService(DataServiceConfiguration
config)
        {
            // TODO: set rules to indicate which entity sets and service
operations are visible, updatable, etc.
            // Examples:
            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(“The EventLogSource
appsetting is missing in the configuration file”);
            }

            return new LogDataSource(source);

        }
    }
}

咱重新来形容个大概控制高客户端消费这个Service,通过Visual
Studio的丰富服务引用生成服务之客户端代码,还可以利用一个插件Open Data
Protocol
Visualizer
翻服务返回的OData数据数据,这个家伙的得与安可参考VS2010的扩展。可以由此劳动引用的“View
in Diagram”进行查。

XML 2

客户端的代码也非常简单;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClientDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            LogDataService.LogDataSource logSource = new
LogDataService.LogDataSource(new
Uri(“http://localhost:3399/LogDataService.svc/”));))
            foreach (var item in logSource.LogEntries)
            {
               
Console.WriteLine(string.Format(“来自{0}事件{1},内容{2}”, item.Source,
item.EventID, item.Message));
            }
            Console.Read();
        }
    }
}

 

列代码可以交此地获得
http://cid-33478a966734670f.skydrive.live.com/self.aspx/.Public/ReflectionDataServiceDemo.zip

相关文章

网站地图xml地图