我想知道两件事的可能性:
是否可以使用 WCF 数据服务来公开它所映射到的实体模型 (EDMX) 中不存在的“集合”?这会是拦截器有意义的情况吗?
如何在无需安装 WCF Rest Starter Kit 或在 ASP.NET 4 项目上使用“内置”库的情况下创建 WCF RESTful 服务?我之所以这么问,是因为我们所做的所有工作都被推送到生产服务器上,在那里我们无法轻松安装入门工具包或其他软件。
这两个问题的答案都非常简单。给定 WCF 数据服务,创建一个返回IEnumerable<T>的方法,并使用 [WebGet] 属性从服务中公开它。
这是一步一步的:
假设一个实体数据模型或 Linq To Sql 模型公开了一个名为 MyDBDataContext 的数据上下文。
WCF 数据服务的代码如下所示:
public class MyWCFDataService : DataService< MyDBDataContext >
{
// 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;
}
}
假设您有一些不在模型中的实体。在这种情况下,我将使用“Person”作为示例:
公共类人 { 公共 int PersonID { 获取;放; } 公共字符串名字 { 获取;放; } 公共字符串姓氏 { 获取;放; } }
只需向您的 WCF 数据服务类添加一个方法,该方法返回您的类型并使用 [WebGet] 进行装饰:
公共类 CustomerDataServ : DataService< Data.CustDataClassesDataContext > {
[WebGet]
public IEnumerable<Person> GetEntries() {
List<Person> entries = new List<Person>();
for (int i = 0; i < 30; i++) {
entries.Add(
new Person() { PersonID = i, FirstName = "First " + i, LastName = "Last " + i }
);
}
return entries.ToArray();
}
// 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;
}
}