메모리 내 개체 그래프를 사용하여 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; }
}
}
어쩌면 내가 누락되었지만 서비스 및 콘솔 앱이 같은 위치에있는 이유는 무엇입니까? 어떻게 당신은 서비스를 호스팅하고 있습니까? 브라우저에서 서비스 운영을 요청 했습니까? 스택 트레이스는 무엇을 말합니까? –
이 서비스는 자체 호스팅 서비스가되고 싶습니다. 콘솔 프로젝트에서 서비스를 호스팅하고 동일한 앱에서 서비스를 호출합니다. 더 쉬운 테스트를 위해서 전화가 콘솔에 있습니다. – gyurisc