Person이라는 엔터티를 노출한다고 가정합니다. 로 보일 수 WCF REST 서비스는 다음과 같습니다
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public partial class PeopleWebService
{
[WebGet(UriTemplate = "")]
public List<Person> GetCollection()
{
try
{
IPeopleRepository repository = ServiceLocator.GetInstance<IPeopleRepository>();
var people = repository.GetPeople();
// use automapper to map entities to Person resource
var result = Mapper.Map<List<Person>>(people);
return result;
}
catch (Exception exception)
{
// do logging etc
throw new WebFaultException(HttpStatusCode.InternalError);
}
}
/* other methods */
}
이러한 서비스는 너무 T4에 의해 생성 될 수있다.
WCF 서비스 자체에는 인터페이스가 필요하지 않습니다. 내 서비스가 데이터베이스 엔티티와 다르게 발전함에 따라 일반적으로 WCF 서비스에 직접 데이터베이스 엔티티를 노출시키지 않습니다. API가 게시되면 거의 동일하게 유지되어야합니다. 이렇게하면 새로운 요구 사항에 맞게 데이터베이스 스키마를 변경하지 못하게됩니다.
대신 엔티티를 리소스에 매핑합니다. 다음과 같이 그래서 Person
5 월 보인다 :
[DataContract]
public class Person
{
[DataMember]
public string GivenName { get; set; }
/* more properties */
}
뿐만 아니라이를 생성하는 T4를 사용하는 좋은 일이 될 수 있습니다. 라우팅는 다음과 같이 정의된다 :
public void Register(RouteCollection routes)
{
routes.AddService<WorkspaceWebService>("api/v1/people");
}
, 당신은, 어셈블리로 위에서 정의 된 자원 (일명 사람)를 공유 할 수있는 ASP.NET MVC 프로젝트에서 소비하기 위해 또는 별도의를 생성하는 T4를 사용할 수 있습니다 거의 동일한 리소스 집합이지만 유효성 검사에 사용되는 것과 같은 ASP.NET MVC에 필요한 몇 가지 추가 특성이 있습니다. 내 ASP.NET MVC보기 모델은 일반적으로 독립적으로 내 REST 리소스로 발전하기 때문에이를 생성합니다.
REST 서비스가 https://api.example.com/에서 실행되고 MVC 웹 사이트가 https://www.example.com/에서 실행되는 것으로 가정합니다. PeopleController는 다음과 같이 보일 것입니다.
public class PeopleController : ControllerBase
{
[HttpGet]
public ActionResult Index()
{
return View(Get<List<Person>>(new Uri("https://api.example.com/api/v1/people")));
}
protected T Get<T>(Uri uri)
{
var request = (HttpWebRequest) WebRequest.Create(uri);
request.Method = "GET";
request.ContentType = "text/xml";
using (var response = (HttpWebResponse) request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
Debug.Assert(responseStream != null, "responseStream != null");
var serializer = new DataContractSerializer(typeof (T));
return (T) serializer.ReadObject(responseStream);
}
}
}
}
귀하의 질문에, 나는 당신이 JSON을 사용하고자한다고 가정합니다. 이를 위해서는 요청에 적절한 ContentType을 설정하고 DataContractSeralizer 대신 DataContractJsonSerializer를 사용해야합니다. 날짜와 DataContractJsonSerializer에는 몇 가지 문제가 있습니다. contenttype이 "text/xml"이고 JSON이 "application/json"이면 WCF rest 서비스는 XML을 자동으로 반환합니다.
MVC 응용 프로그램에는 데이터베이스, 데이터베이스 엔터티 또는 데이터베이스 컨텍스트에 대한 지식이 없습니다. 실제로 MVC 응용 프로그램에는 데이터베이스 논리가 없습니다. 사용자 컨텍스트가 WCF rest 서비스에서 누락되어 보안에주의를 기울여야합니다. 그러나 그것은 완전히 다른 논의입니다.
이것은 지난 주에 발견 한 것을 검증합니다. 이것이 최선의 방법이 아닐 수 있습니다. WCF RESTful 템플릿을 사용할 때 순전히 .Net 응용 프로그램 일지라도 데이터 직렬화를위한 추가 코드를 추가해야합니다. 나중에 내가 깨닫게 된 것은 클라이언트 측 (어떤 방식 으로든)이 DAL에 직접 액세스 할 수 없기 때문입니다. 그러나 미래의 프로젝트는 이러한 유연성을 원할 수 있습니다. 직렬화 프로세스에 대한 훌륭한 설명. 감사. – ElHaix
WCF를 사용하여 [이 예제] (http://blogs.msdn.com/b/pedram/archive/2008/04/21/how-to-consume-rest-)에서 설명한대로 모든 직렬화 작업을 자동으로 수행 할 수 있습니다. services-with-wcf.aspx). 그러나 클라이언트에서 특히 오류 처리와 관련하여 많은 기능이 손실됩니다. – bloudraak