У меня есть простой сервис Услуг передачи данных 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. Я также загрузил и установил это обновление:
Наконец-то я решил эту проблему. Для вызова сервисной операции на классе службы данных необходимо использовать методы 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();
(этот ответ неверен (см. комментарии), но намеренно оставлен здесь, чтобы другие ответы не наткнулись вслепую на ту же дыру)
IIRC, он также должен быть [OperationContract]
[OperationContract, WebGet]
public IQueryable<Product> GetProducts()
{
// Simple example for testing
return (new ProductRepository()).Product;
}
(а в идеале сам сервис должен быть [ServiceContract]
)