ADO.NET 数据服务不是独立的网络服务。 ADO.NET 数据服务不会绑定到网络套接字并侦听传入的针对其具象状态传输 (REST) 入口点的请求。相反,ADO.NET 数据服务是一种驻留在提供核心服务器网络工具的环境(例如 Windows Communication Foundation (WCF))中的组件。宿主将处理与网络的直接交互并支持缓存、可伸缩性和身份验证模块。
ADO.NET 数据服务定义一个通用宿主接口 IDataServiceHost,该接口从特定的宿主提取其实现。这样,ADO.NET 数据服务就可以利用自定义 HTTP 服务器端实现(例如 WCF、ASP.NET 和 IIS)在一系列宿主环境中运行。
注意 当使用 ASP.NET 宿主时,字符 (:)和 (/) 将被阻止;如果使用了这两个字符,则将导致生成“400 错误的请求”响应代码。安装修补程序可解决冒号 (:) 的问题。
以下各部分中的示例假设 ADO.NET 数据服务的定义如下:
namespace MyDataService
{
public class MyAstoriaDataService :
DataService<NorthwindModel.NorthwindEntities>
{ // service implementation }
}
使用 Windows Communication Foundation (WCF) 和 ASP.NET 承载 ADO.NET 数据服务
ADO.NET 数据服务可作为 WCF 终结点承载在 ASP.NET 应用程序内。在此实现中,WCF 和 ASP.NET 处理 ADO.NET 数据服务的网络交互。
若要在 ASP.NET 应用程序内的 WCF 中承载 ADO.NET 数据服务,请定义一个新的 WCF 终结点,如下所示:
新建一个 WCF 服务终结点,即 .svc 文件。
在 ServiceHost 声明中:
Factory 属性的值必须是 System.Data.Services.DataServiceHostFactory。
Service 属性必须是要公开的数据服务的完全限定命名空间类名称。
MyAstoriaDataService.svc:
<%@ ServiceHost Language="C#"
Factory="System.Data.Services.DataServiceHostFactory"
Service="MyAstoriaDataService.MyAstoriaDataService"%>
使用 Windows Communication Foundation (WCF) 承载 ADO.NET 数据服务
可以使用 WCF ServiceHost 或 WebServiceHost 类来承载 ADO.NET 数据服务。下面的示例如何演示使用 WebServiceHost 类承载数据服务。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Web;
using System.Data.Services;
namespace SelfHost
{
class Program
{
static void Main(string[] args)
{
Uri baseAddress =
new Uri("https://localhost:8000/dataservice");
HostWithWebServiceHost(baseAddress);
Console.WriteLine(
"Host running - https://localhost:8000/dataservice");
Console.WriteLine("Press any key to shut down service...");
Console.ReadKey();
host.Close();
}
private static void HostWithWebServiceHost(Uri baseAddress)
{
WebServiceHost host = new WebServiceHost(typeof(MyAstoriaDataService),
baseAddress);
WebHttpBinding binding = new WebHttpBinding();
host.AddServiceEndpoint(
typeof(System.Data.Services.IRequestHandler), binding,
"WebServiceHost");
host.Open();
}
}
}