加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Data Service - 1. 基本使用

发布时间:2020-12-17 02:01:22 所属栏目:安全 来源:网络整理
导读:就个人喜好而言,我更喜欢 REST + JSON 这种轻便方案来替代 WebService。虽然 WCF 3.5 对 REST 提供了良好的支持,但在开发 "数据应用" 的时候还是有许多工作要做。随着应用网络化和规模的扩大,SOA 必然会成为一个基本的结构体系。原本的内部模块调用也会逐

就个人喜好而言,我更喜欢 REST + JSON 这种轻便方案来替代 WebService。虽然 WCF 3.5 对 REST 提供了良好的支持,但在开发 "数据应用" 的时候还是有许多工作要做。随着应用网络化和规模的扩大,SOA 必然会成为一个基本的结构体系。原本的内部模块调用也会逐步分离,形成多个独立的子系统,各系统之间的调用接口会随着时间慢慢增多变得极其臃肿,最终成为 一个麻烦。其实很多时候,我们需要用一种 "安全" 而 "标准" 的方式 "暴露" 数据,而不是在服务中编写大量其他业务单元的逻辑方法,这好似将业务逻辑写成数据库存储过程一般,最终形成雷区。幸好程序界不缺懒人,EDM + WCF -> Data Service 就是这样一个让更多人偷懒的优雅方案。

Data Service 封装了 REST 的相应规则,让我们用一种 "时髦" 的方式暴露数据 (Entity / EntitySet)。REST +??ATOM XML/JSON 的组合方式又使得其具备客户端平台无关性的特征,很显然这是个不错的主意。值得一提的是,.NET Client 依然可以用 LINQ 的方式操作数据,将麻烦的 URL 拼接和通讯交给 Data Service Client 去处理。

写个简单的例子演示一下

1. 准备好数据库,创建一个 ASP.NET 工程作为 Data Service .svc 的宿主 (ServiceHost)。
2. 创建 ADO.NET Entity Data Model,数据库链接参数中最好打开 "MultipleActiveResultSets=True"。

uploads/200904/22_112438_1.png



3. 创建 ADO.NET Data Service。

uploads/200904/22_112442_2.png



4. 编辑代码。

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

namespace DataService.Web
{
public class Test : DataService<TestEntities>
{
public static void InitializeService(IDataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*",EntitySetRights.All);
// config.SetServiceOperationAccessRule("MyServiceOperation",ServiceOperationRights.All);
}
}
}


5. 打开浏览器。

uploads/200904/22_112446_3.png



接下来的操作,我们需要借助一些工具 (HttpWatch Pro),IE 并不能直接显示某些 ContentType。

http://localhost:2394/Test.svc/Orders

GET /Test.svc/Orders HTTP/1.1

HTTP/1.1 200 OK
Server: ASP.NET Development Server/9.0.0.0
Date: Wed,22 Apr 2009 03:14:24 GMT
X-AspNet-Version: 2.0.50727
DataServiceVersion: 1.0;
Cache-Control: no-cache
Content-Type: application/atom+xml;charset=utf-8
Content-Length: 5709
Connection: Close

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://localhost:2394/Test.svc/ " xmlns:d="http://schemas.microsoft.com/.../dataservices " xmlns:m="http://schemas.microsoft.com/.../dataservices/metadata " xmlns="http://www.w3.org/2005/Atom ">
<title type="text">Orders</title>
<id>http://localhost:2394/Test.svc/Orders </id>
<updated>2009-04-22T03:14:24Z</updated>
<link rel="self" title="Orders" href="Orders" />
<entry>
<id>http://localhost:2394/Test.svc/Orders (1)</id>
<title type="text"></title>
<updated>2009-04-22T03:14:24Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Order" href="Orders(1)" />
<category term="TestModel.Order" scheme="http://schemas.microsoft.com.../dataservices/scheme " />
<content type="application/xml">
<m:properties>
<d:Id m:type="Edm.Int32">1</d:Id>
<d:Title>订单1</d:Title>
<d:Price m:type="Edm.Decimal">100.0000</d:Price>
<d:UserId m:type="Edm.Int32">2</d:UserId>
</m:properties>
</content>
</entry>
<entry>
<id>http://localhost:2394/Test.svc/Orders (2)</id>
<title type="text"></title>
<updated>2009-04-22T03:14:24Z</updated>
<author>
<name />
</author>
<link rel="edit" title="Order" href="Orders(2)" />
<category term="TestModel.Order" scheme="http://schemas.microsoft.com/.../dataservices/scheme " />
<content type="application/xml">
<m:properties>
<d:Id m:type="Edm.Int32">2</d:Id>
<d:Title>订单2</d:Title>
<d:Price m:type="Edm.Decimal">102.0000</d:Price>
<d:UserId m:type="Edm.Int32">3</d:UserId>
</m:properties>
</content>
</entry>
</feed>


http://localhost:2394/Test.svc/Orders (2)/Title

HTTP/1.1 200 OK
Server: ASP.NET Development Server/9.0.0.0
Date: Wed,22 Apr 2009 03:17:03 GMT
X-AspNet-Version: 2.0.50727
DataServiceVersion: 1.0;
Cache-Control: no-cache
Content-Type: application/xml;charset=utf-8
Content-Length: 141
Connection: Close

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Title xmlns="http://schemas.microsoft.com/.../dataservices ">订单2</Title>


很 显然,这种方式就是我们所熟悉的 RESTful。

6. 我们可以在客户端导入服务,就像 WebService 和 WCF 那样。

uploads/200904/22_112450_4.png

?

class Program
{
static void Main(string[] args)
{
var context = new TestEntities(new Uri("http://localhost:2394/test.svc "));

var q = from o in context.Orders where o.Id > 2 select o;

foreach (var order in q)
{
Console.WriteLine(order.Title);
}
}
}


这代码很熟悉,和我们写 LINQ to Entities 没啥区别。Data Service 会将自动其转换成 URI / REST。

7. 既然是 REST,自然少不了用 JavaScript 演示一下,我选择我所熟悉的 jQuery。

$.getJSON("/test.svc/Orders",function(data)
{
$("#a").empty();

$.each(data.d,function(i,order)
{
$("#a").append(order.Id + "," + order.Title + "<br />");
});
});


JSON 格式输出

HTTP/1.1 200 OK
Server: ASP.NET Development Server/9.0.0.0
Date: Wed,22 Apr 2009 03:33:50 GMT
X-AspNet-Version: 2.0.50727
DataServiceVersion: 1.0;
Cache-Control: no-cache
Content-Type: application/json;charset=utf-8
Content-Length: 1397
Connection: Close

{
"d": [
{
"__metadata": {
"uri": "http://localhost:2394/Test.svc/Orders (1)",
"type": "TestModel.Order"
},
"Id": 1,
"Title": "8ba253551",
"Price": "100.0000",
"UserId": 2
},
{
"__metadata": {
"uri": "http://localhost:2394/Test.svc/Orders (2)","type": "TestModel.Order" },"Id": 2,"Title": "8ba253552","Price": "102.0000","UserId": 3 } ] }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读