2012-08-24 2 views
0

메모리 내 개체 그래프를 사용하여 WCF DataService를 만들려고합니다. 즉, 백엔드는 Entity Framework 저장소가 아니라 메모리에있는 많은 개체입니다.WCF 데이터 만들기 메모리 내 개체로 서비스 작업

GetUsersByName이라는 서비스 작업을 만들려고하는데 이름에 단일 매개 변수가 있고 일치하는 사용자를 IQueryable 컬렉션으로 반환합니다.

나는 문서를 다음이 조작

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; } 
     } 
    } 
+0

어쩌면 내가 누락되었지만 서비스 및 콘솔 앱이 같은 위치에있는 이유는 무엇입니까? 어떻게 당신은 서비스를 호스팅하고 있습니까? 브라우저에서 서비스 운영을 요청 했습니까? 스택 트레이스는 무엇을 말합니까? –

+0

이 서비스는 자체 호스팅 서비스가되고 싶습니다. 콘솔 프로젝트에서 서비스를 호스팅하고 동일한 앱에서 서비스를 호출합니다. 더 쉬운 테스트를 위해서 전화가 콘솔에 있습니다. – gyurisc

답변

1

여기에 몇 가지 작업이있는 것처럼 보입니다. 이렇게하면 작업을 반복하는 데 몇 가지 걸릴 수 있습니다. 해결해야 할 첫 번째 문제는 서비스 운영입니다. DataService로부터 상속받은 클래스에 대해 서비스 작업을 선언해야합니다 ("Service operations are methods added to the data service class that derives from DataService"). http://localhost:59803/ScratchService.svc/FuzzySearch()?idStartsWith='1'

우리가이 기능을 얻으려고 노력으로 시작할 수 :

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 형식으로, 브라우저에서 서비스 작업을 호출 할 수 있어야한다 : 다음은 샘플입니다 브라우저를 실행 한 다음 AggregateException이 여전히 발생하는지 확인하십시오.

+0

그런 식으로 작동합니다. 지금 가지고있는 유일한 문제는 작업을 포함 할 클라이언트를 자동으로 (웹 참조를 추가하여) 프록시를 만들 수 없다는 것입니다. 이것이 실현되지 않는다는 것을 이해합니다. – gyurisc

+0

맞습니다. 서비스 운영을위한 코드 gen은 없습니다 (아직 :)). –