WCF数据服务不公开服务操作

时间:2014-12-11 17:39:42

标签: c# .net wcf odata

我正在使用开放数据协议(OData)制作一些POC。我的目标是将一些自定义方法作为服务操作与实体一起公开,但它们在可访问时不会显示。

namespace WebApplication1
{
    public class WcfDataService2 : DataService<MyDataSourceProvider>
    {
        public static void InitializeService(DataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("MyProducts", EntitySetRights.AllRead);
            config.SetEntitySetAccessRule("MySuppliers", EntitySetRights.AllRead);
            config.SetEntitySetAccessRule("MyLondonSuppliers", EntitySetRights.AllRead);

            config.SetServiceOperationAccessRule("GetSuppliersByCity", ServiceOperationRights.AllRead);
            config.SetServiceOperationAccessRule("LondonSuppliers", ServiceOperationRights.AllRead);
            config.SetServiceOperationAccessRule("UpdateProductName", ServiceOperationRights.All);

            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }

        [WebGet]
        public IQueryable<Supplier> GetSuppliersByCity(string city)
        {
            return DataRepository.Suppliers.Where(s => s.Town.ToLower().Contains(city.ToLower())).AsQueryable();
        }

        [WebGet]
        public IQueryable<Supplier> LondonSuppliers()
        {
            return DataRepository.Suppliers.Where(s => s.County == "London").AsQueryable();
        }

        [WebGet]
        public string UpdateProductName(int ID, string Name)
        {
            DataRepository.Products.First(p => p.ProductID == ID).Name = Name;
            return "ok";
        }
    }
}

当我在http://localhost:51696/WcfDataService2.svc/查询服务时,我看到的只是实体:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<service xml:base="http://localhost:51696/WcfDataService2.svc/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app">
  <workspace>
    <atom:title>Default</atom:title>
    <collection href="MyProducts">
      <atom:title>MyProducts</atom:title>
    </collection>
    <collection href="MySuppliers">
      <atom:title>MySuppliers</atom:title>
    </collection>
    <collection href="MyLondonSuppliers">
      <atom:title>MyLondonSuppliers</atom:title>
    </collection>
  </workspace>
</service>

没有方法的痕迹:

  • GetSuppliersByCity
  • LondonSuppliers
  • UpdateProductName

我错过了什么吗?

顺便说一下,我正在使用Visual Studio 2010和.NET 4.0。

2 个答案:

答案 0 :(得分:0)

尝试将MaxProtocolVersion设置为V3

config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;

答案 1 :(得分:0)

对我来说不幸的是,OData V2似乎有一些限制,包括公开服务操作的能力:

  

服务操作(调用WebGet方法)不会在服务文档中公开(即对服务器根目录的请求的响应)。只有实体集在那里暴露。

我在某些Microsoft Forum thread找到了这个答案。