Предположим, вы хотите предоставить объект с именем 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
может выглядеть следующим образом:
[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, вы можете поделиться своими ресурсами (также известными как Person), как определено выше, как сборку, или вы можете использовать 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 в запросе и использовать DataContractJsonSerializer, а не DataContractSeralizer. Обратите внимание, что есть некоторые проблемы с датами и DataContractJsonSerializer. Служба отдыха WCF автоматически возвращает XML, если тип содержимого — «text/xml», и JSON, если это «application/json».
Обратите внимание, что приложение MVC ничего не знает о базе данных, объектах базы данных или ее контексте базы данных. На самом деле в приложении MVC нет логики базы данных. Вам придется уделить пристальное внимание безопасности, потому что пользовательский контекст отсутствует в оставшихся службах WCF. Но это уже совсем другое обсуждение.
person
bloudraak
schedule
24.03.2012