如何实现自托管 WCF 数据服务(http://localhost:1234/myDataService.svc/...)
Posted
技术标签:
【中文标题】如何实现自托管 WCF 数据服务(http://localhost:1234/myDataService.svc/...)【英文标题】:How to implement Self-host WCF data services (http://localhost:1234/myDataService.svc/...) 【发布时间】:2011-03-03 19:42:11 【问题描述】:我有一个项目需要实现 WCF 数据服务 (OData) 以从控制系统(.NET Framework 应用程序)中检索数据。 WCF 数据服务需要由 .NET 应用程序托管(无 ASP.NET 和无 IIS)。
我最近看到了很多 WCF 数据服务示例;它们都由 ASP.NET 应用程序托管。我还看到了自主机(控制台应用程序)示例,但它适用于 WCF 服务(不是 WCF 数据服务)。
可以有一个独立的 .NET 应用程序来托管 WCF 数据服务 (http://localhost:1234/mydataservice.svc/...)。
如果是,有人可以举个例子吗?
【问题讨论】:
你试过了吗?您是否能够自行托管正常的 WCF 服务? 赏金将在时间限制结束后转到marc_s。 (因为他出色的答案为我节省了大量时间。)赏金不需要新的答案。 【参考方案1】:我刚刚尝试了同样的事情 - 是的,您可以在自己的程序集中托管 WCF 数据服务 - 只需一些小技巧。
方法如下:
把你的数据模型(EF Data Model)放到自己的程序集中,我们称之为DataModel
新建一个类库项目(命名为MyDataServiceHost
)
添加一些参考:
您的DataModel
与数据层的程序集
System.ServiceModel
System.ServiceModel.Web
System.Data.Services.Client
System.Data.Services
- 您不能从 .NET 类别下的常用 Add Reference
对话框中选择它 - 您需要浏览程序集文件。找到目录 C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0
(或在 64 位机器上为 C:\Program Files (x86)\...
)并选择其中的 System.Data.Services.dll
向该类库添加一个新类并调用它,例如YourDataService.cs
- 它看起来像这样:
using System.Data.Services;
using System.Data.Services.Common;
using DataModel;
namespace MyDataServiceHost
public class YourDataService : DataService<YourModelEntities>
// 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.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
您可以为该类命名任何您喜欢的名称,它必须从DataService<T>
派生,其中T
是您的数据模型的名称;如果您使用的是实体框架,则它是您的对象上下文类的名称 - 通常类似于 (database)Entities
或您在创建 EDM 时选择的任何名称
在你的新项目中添加另一个类,命名为MyDataServiceHost.cs
,它看起来像这样:
using System;
using System.Data.Services;
using DataModel;
namespace MyDataServiceHost
public class MyDataServiceHost
public static void LaunchDataService(string baseAddress)
Uri[] baseAddresses = new Uri[1];
baseAddresses[0] = new Uri(baseAddress);
using(DataServiceHost host = new DataServiceHost(typeof(YourDataService), baseAddresses))
host.Open();
Console.WriteLine("DataService up and running.....");
Console.ReadLine();
host.Close();
它实例化了一个派生自 WebServiceHost(又派生自 ServiceHost)的 DataServiceHost,它将为您启动 WCF 数据服务运行时。
现在您可以使用以下方式从任何应用程序启动 WCF 数据服务:
MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService");
要记住的最后一件事:用于启动 WCF 数据服务的应用程序必须在其app.config(或 web.config)为了使它工作!
【讨论】:
如果你还在看这个问题,我按照你的回答让服务运行了,但是当我尝试在 Firefox 中像这样查看它时:localhost:4444/EntitySearch/Countries我得到了这个结果:Resource not found for the segment 'Countries'.
我仔细检查了我的 EF 代码,那里有那个类('public ObjectSet以上是关于如何实现自托管 WCF 数据服务(http://localhost:1234/myDataService.svc/...)的主要内容,如果未能解决你的问题,请参考以下文章
具有 CORS 和基本身份验证支持的 WCF 自托管数据服务
如何让我的自托管 WCF 服务不尝试保留 localhost 以外的 url?