Почему мой метод ServiceOperation отсутствует в моем прокси-коде клиента служб данных WCF? - PullRequest
7 голосов
/ 18 марта 2010

У меня есть простая служба данных 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;
}

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

Я использую Visual Studio 2008 SP1 и .NET Framework 3.5 SP1. Я также скачал и установил это обновление:

MS KB: 976127 - доступно обновление, которое предоставляет дополнительные функции и улучшения для служб данных ADO.NET в .NET Framework 3.5 с пакетом обновления 1 (SP1) на компьютере под управлением Windows 7 или Windows Server 2008 R2

Ответы [ 3 ]

10 голосов
/ 18 марта 2010

Наконец-то решил это.Чтобы вызвать операцию службы для класса обслуживания данных, вам необходимо использовать методы 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();
1 голос
/ 18 марта 2010

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


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

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

(и в идеале сама служба будет [ServiceContract])

0 голосов
/ 09 февраля 2011

У меня была похожая проблема со следующим примером

 [System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
 public class TestService : DataService<MyService>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {

        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.AllRead);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;

    }

    [WebGet]
    public IQueryable<string> GetStrings(int index)
    {
        string[] list = { "One", "two" };
        return list.AsQueryable(); 

    }
}

Когда я просматривал сервис http://localhost:3059/TestService.svc, в списке не было метода с атрибутом WebGet, но я могу получить к нему доступ, используя http://localhost:3059/TestService.svc/GetStrings?index=1

Это говорит о том, что в определении службы данных WCF не перечисляются операции, когда он просматривается через веб-браузер, или существует какой-то недокументированный способ получить оба в списке.

...