Почему мой метод ServiceOperation отсутствует в моем клиентском коде прокси Услуг передачи данных WCF?

У меня есть простой сервис Услуг передачи данных WCF, и я хочу выставить Сервисную Деятельность следующим образом:

[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class ProductDataService : DataService
{
    // 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 GetProducts()
{
    // Simple example for testing
    return (new ProductRepository()).Product;
}

Почему не GetProducts метод, видимый, когда я добавляю сервисную ссылку на клиенте?

Я выполняю Visual Studio 2008 SP1 и Платформу.NET 3,5 SP1. Я также загрузил и установил это обновление:

MS КБ: 976127 - обновление доступно, который обеспечивает дополнительные функции и улучшения для Услуг передачи данных ADO.NET в Платформе.NET 3,5 SP1 на компьютере, который запускает Windows 7 или Windows Server 2008 R2

7
задан Kev 18 March 2010 в 08:07
поделиться

2 ответа

Наконец-то я решил эту проблему. Для вызова сервисной операции на классе службы данных необходимо использовать методы CreateQuery или Execute контекстного объекта службы данных. Например:

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();

Если бы требовались параметры, скажем, категория продукта в операции обслуживания, которая имеет такую подпись:

[WebGet]
public IQueryable<Product> GetProducts(string category)

Мы бы сделали:

// 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();
10
ответ дан 6 December 2019 в 23:04
поделиться

(этот ответ неверен (см. комментарии), но намеренно оставлен здесь, чтобы другие ответы не наткнулись вслепую на ту же дыру)


IIRC, он также должен быть [OperationContract]

[OperationContract, WebGet]
public IQueryable<Product> GetProducts()
{
    // Simple example for testing
    return (new ProductRepository()).Product;
}

(а в идеале сам сервис должен быть [ServiceContract])

1
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: