为什么我的WCF数据服务客户端代理代码中缺少ServiceOperation方法?

Kev*_*Kev 7 astoria visual-studio-2008 wcf-data-services

我有一个简单的WCF数据服务服务,我想公开一个服务操作,如下所示:

[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class ProductDataService : DataService<ProductRepository>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(IDataServiceConfiguration config)
    {
      config.SetEntitySetAccessRule("*", 
            EntitySetRights.ReadMultiple | EntitySetRights.ReadSingle);
      config.SetServiceOperationAccessRule("*", 
            ServiceOperationRights.All);
      config.UseVerboseErrors = true;
    }

// This operation isn't getting generated client side
[WebGet]
public IQueryable<Product> GetProducts()
{
    // Simple example for testing
    return (new ProductRepository()).Product;
}
Run Code Online (Sandbox Code Playgroud)

GetProducts当我在客户端添加服务引用时,为什么方法不可见?

我正在运行Visual Studio 2008 SP1和.NET Framework 3.5 SP1.我还下载并安装了此更新:

MS KB:976127 - 提供了一个更新,它为运行Windows 7或Windows Server 2008 R2的计算机上的.NET Framework 3.5 SP1中的ADO.NET数据服务提供了其他功能和改进

Kev*_*Kev 10

终于解决了这个.要在数据服务类上调用服务操作,您需要使用数据服务上下文对象CreateQueryExecute方法.例如:

ProductDataService ctx = new ProductDataService(
    new Uri("http://localhost:1234/ProductDataService.svc/"));

// Method 1:
DataServiceQuery<Product> q = ctx.CreateQuery<Product>("GetProducts");
List<Product> products = q.Execute().ToList();

// Method 2:
Uri uri = new Uri(String.Format("{0}GetProducts", ctx.BaseUri), 
             UriKind.RelativeOrAbsolute);
List<Product> products = ctx.Execute<Product>(uri).ToList();
Run Code Online (Sandbox Code Playgroud)

如果需要参数,请说明具有此签名的服务操作的产品类别:

[WebGet]
public IQueryable<Product> GetProducts(string category)
Run Code Online (Sandbox Code Playgroud)

我们会这样做:

// Method 1:
DataServiceQuery<Product> q = ctx.CreateQuery<Product>("GetProducts")
                                .AddQueryOption("category", "Boats") ;
List<Product> products = q.Execute().ToList();

// Method 2:
Uri uri = new Uri(String.Format("{0}GetProducts?category={1}", 
                    ctx.BaseUri, "Boats"), UriKind.RelativeOrAbsolute);
List<Product> products = ctx.Execute<Product>(uri).ToList();
Run Code Online (Sandbox Code Playgroud)