7

単純な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 Studio2008SP1と.NETFramework3.5SP1を実行しています。このアップデートもダウンロードしてインストールしました。

MS KB:976127-Windows7またはWindowsServer2008R2を実行しているコンピューター上の.NETFramework3.5SP1のADO.NETDataServicesに追加機能と改善を提供する更新プログラムが利用可能です

4

3 に答える 3

10

最後にこれを解決しました。データ サービス クラスでサービス操作を呼び出すには、データ サービス コンテキスト オブジェクト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();
于 2010-03-18T08:20:54.670 に答える
1

(この回答は正しくありません(コメントを参照)が、他の回答が同じ穴に盲目的につまずくのを防ぐために、意図的にここに残されています)


IIRC、それはまたである必要があります[OperationContract]

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

(理想的には、サービス自体は[ServiceContract]

于 2010-03-18T05:32:43.147 に答える
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 データ サービス定義が、Web ブラウザーを介してブラウズしたときに操作をリストしないか、リストに両方を取得するための文書化されていない方法があることを示唆しています。

于 2011-02-09T15:09:35.250 に答える