2010-03-18 13 views
7

我有一個簡單的WCF數據服務服務,我要公開服務操作方法如下:爲什麼我的WCF數據服務客戶端代理代碼中缺少ServiceOperation方法?

[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 - An update is available that provides additional features and improvements for ADO.NET Data Services in the .NET Framework 3.5 SP1 on a computer that is running Windows 7 or Windows Server 2008 R2

+0

操作通過.svc文件不可見。他們在元數據文件中可以看到這個URL:http:// localhost:3059/TestService.svc/$ metadata – 2011-12-07 14:01:02

回答

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

假如要求的參數,比如在服務操作的產品類別是有這樣的簽名:

[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(); 
+0

感謝您在找到答案後發佈答案! – 2011-02-22 16:04:37

+0

WCF數據服務可怕的另一種破壞方式是...感謝您使用此解決方案。 – Yuck 2011-06-16 19:28:31

+1

這是微軟的一位博客文章,詳細介紹了上述內容。 http://blogs.msdn.com/b/writingdata_services/archive/2011/03/28/calling-service-operations-from-the-client.aspx。基本上相同的信息,但也許值得有人。 – 2011-07-21 17:16:54

1

(這個答案是不正確(見註釋),但這裏是故意留下來阻止其他答案盲目跌進同穴)


IIRC,它也需要一個[OperationContract]

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

(理想服務本身將是一個[ServiceContract]

+1

Morning Marc。我嘗試用'OperationContract'屬性裝飾,但在客戶端添加服務引用時出現錯誤:「OperationContractAttributes只對在具有ServiceContractAttribute的類型中聲明的方法有效」。 – Kev 2010-03-18 05:52:46

+0

Then ...如果我按照建議向類中添加'[ServiceContract]'屬性,那麼會得到一個不同的錯誤:類型的服務類都定義了一個ServiceContract並從類型System.Data.Services繼承了一個ServiceContract。 IRequestHandler。合約繼承只能在接口類型中使用。如果一個類用ServiceContractAttribute標記,它必須是具有ServiceContractAttribute的層次結構中的唯一類型。「我理想的情況不是最終得到兩個服務 – Kev 2010-03-18 05:53:54

+0

@Kev - 確定;然後忽略它。如果有其他人陷入了同樣的錯誤,我會激發astoria ... – 2010-03-18 06:13:52

0

我也有類似問題如下

[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數據服務定義沒有列出來訪問它當它通過網絡瀏覽器瀏覽時的操作,或者有一些沒有記錄的方法可以同時在列表中找到。

相關問題