0

メモリ内のオブジェクトグラフを使用してWCFDataServiceを作成しようとしています。これは、バックエンドがEntity Frameworkストアではなく、メモリ内に存在する一連のオブジェクトであることを意味します。

名前の単一のパラメーターを持ち、一致するユーザーをIQueryableコレクションとして返すGetUsersByNameというサービス操作を作成しようとしています。

ドキュメントに従い、この操作のアクセスルールを追加しました

config.SetServiceOperationAccessRule("GetUsersByName", ServiceOperationRights.All);

しかし、SetServiceOperationAccessRuleメソッドが呼び出されると、クライアントで例外が発生します。

System.AggregateException was unhandled.

これが私のコンソールアプリケーションの完全なコードです

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Description;
    using System.Data.Services;
    using System.Data.Services.Common;
    using System.Collections.Generic;
    using System.Runtime.Serialization;
    using System.Collections.ObjectModel;
    using System.Linq;
    using System.Web;
    using System.Net.Http;
    using System.Net;
    using System.IO; 

    namespace WCF_OData
    {

        class Program
        {
            static void Main(string[] args)
            {
                string serviceAddress = "http://localhost:8080";
                Uri[] uriArray = { new Uri(serviceAddress) };
                Type serviceType = typeof(UserDataService);

                using (var host = new DataServiceHost(serviceType, uriArray)) {
                    host.Open();

                    var client = new HttpClient() { BaseAddress = new Uri(serviceAddress) };
                    Console.WriteLine("Client received: {0}", client.GetStringAsync("Users?$format=json").Result);

                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:8080");
                    request.Method = "GET";
                    request.Accept = @"application/json";

                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        Console.WriteLine(response.StatusCode);
                        Console.WriteLine(response.ContentType);
                        Console.WriteLine((new StreamReader(response.GetResponseStream())).ReadToEnd());
                    }

                    Console.WriteLine("Press any key to stop service");
                    Console.ReadKey();
                }

            }
        }

        [EnableJsonSupport]
        [ServiceBehavior(IncludeExceptionDetailInFaults = true)]   
        public class UserDataService : DataService<UserService> {
            public static void InitializeService(DataServiceConfiguration config)
            {
                config.SetEntitySetAccessRule("Users", EntitySetRights.All);
                config.SetServiceOperationAccessRule("GetUsersByName", ServiceOperationRights.All);

                config.UseVerboseErrors = true;

                config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
            }

        }

        public class UserService
        {
            private List<User> _List = new List<User>();

            public UserService()
            {
                _List.Add(new User() { ID = 1, UserName = "John Doe" });
                _List.Add(new User() { ID = 2, UserName = "Jane Doe" });
            }

            public IQueryable<User> Users
            {
                get
                {
                    HttpContext x = HttpContext.Current;
                    return _List.AsQueryable<User>();
                }
            }

            [OperationContract]
            [WebGet(UriTemplate="GetUsersByName")]
            public IQueryable<User> GetUsersByName(string name)
            {
                return new List<User>().AsQueryable(); 
            }
        }

        [DataServiceKey("ID")]
        public class User
        {
            public int ID { get; set; } 
            public string UserName { get; set; }
        }
    }
4

1 に答える 1

1

ここでいくつかの処理が行われているようです。そのため、処理には数回の反復が必要になる場合があります。最初に修正する必要がある問題は、サービスの運用です。サービス操作は、DataService から継承するクラスで宣言する必要があります。「サービス操作は、DataService から派生するデータ サービス クラスに追加されるメソッドです」。サンプルは次のとおりです。

using System.Data.Entity;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace Scratch.Web
{
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class ScratchService : DataService<ScratchEntityFrameworkContext>
    {
        static ScratchService()
        {
            Database.SetInitializer(new ScratchEntityFrameworkContextInitializer());
        }

        public static void InitializeService(DataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.AllRead);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
            config.UseVerboseErrors = true;
        }

        [WebGet]
        public IQueryable<Product> FuzzySearch(string idStartsWith)
        {
            var context = new ScratchEntityFrameworkContext();
            return context.Products.ToList().Where(p => p.ID.ToString().StartsWith(idStartsWith)).AsQueryable();
        }
    }
}

次に、次のような URL 形式を使用して、ブラウザーからサービス操作を呼び出すことができるはずです。http://localhost:59803/ScratchService.svc/FuzzySearch()?idStartsWith='1'

ブラウザーでこの機能を取得することから始めて、AggregateException がまだ発生するかどうかを確認できますか?

于 2012-08-24T16:07:36.183 に答える