我有一个服务应用程序,它通过不同的绑定托管几个WCF端点。我现在想要在同一个服务主机中托管WCF数据服务。 This post让我相信这是可能的。但是,有关如何创建WCF数据服务的每个示例都是从ASP.NET Web项目内部创建的,而不是类库或服务应用程序。实际上,当从这些项目类型中选择一个时,WCF数据服务甚至不会出现在添加新项目中 我的问题是如何在类库中创建一个WCF数据服务,它将由服务主机调用,该服务主机已经托管了其他几个WCF端点? The link我已经引用了如何在创建数据服务之后如何托管数据服务,但由于它没有显示为添加新项目的选项,因此我无法忍受。
答案 0 :(得分:7)
是的,您可以在自己的程序集中托管WCF数据服务 - 只需一些小技巧。
以下是:
将您的数据模型(EF数据模型)放入自己的程序集中,我们称之为DataModel
创建一个新的类库项目(称之为MyDataServiceHost
)
添加一些参考文献:
DataModel
程序集与数据层System.ServiceModel
System.ServiceModel.Web
System.Data.Services.Client
System.Data.Services
- 您无法从.NET类别下的常用Add Reference
对话框中选择此项 - 您需要浏览汇编文件。在64位计算机上找到目录C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0
(或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();
}
}
}
}
它实例化一个DataServiceHost,它派生自WebServiceHost(后者又派生自ServiceHost),它将为您启动WCF数据服务运行时。
现在您可以使用以下任意应用启动您的WCF数据服务:
MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService");
要记住的最后一件事:用于启动WCF数据服务的应用必须具有连接字符串(EDM连接字符串,如果您使用的是实体框架) app.config(或web.config)以使其正常工作!
答案 1 :(得分:0)
您可以实现此目的的一种方法是创建一个ASP.NET项目以包含WCF数据服务,然后创建define a custom data service host(向下滚动到“定义自定义数据服务主机”部分)作为现有WCF主机和数据服务之间的中介。
答案 2 :(得分:0)
经过大量挖掘后,我在这篇文章中找到了答案:http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/3191377e-f3f9-4d46-8daf-431cf74cef7c
我需要使用DataService<T>
类,传递包含所有实体的ObjectContext
。工作得很好