WCF REST Starter Kit - поддержка нескольких ресурсов? - PullRequest
1 голос
/ 10 февраля 2009

Я только начал возиться с стартовым комплектом WCF REST, я смотрел скринкасты и ... я подозреваю, что просто глуп. :) Из коробки (с предоставленными шаблонами) я могу создавать REST-сервисы для одноэлементного ресурса или коллекции ресурса. Но как насчет поддержки различных видов ресурсов в одном проекте? Например, если у меня есть Книги, я также хочу иметь авторов и издателей. С предоставленными шаблонами я не вижу простого способа сделать это. Создание сервиса (и, следовательно, проекта VS) для каждого ресурса звучит для меня нелепо. Мне нужно поддерживать несколько типов ресурсов в одном сервисе, чтобы к ним можно было обращаться по одному и тому же URL, чтобы пользователю оставалось только заменить последнюю часть, например http://service/books, чтобы получить все книги и http://service/authors/32, чтобы получить конкретного автора.

Может кто-нибудь пролить свет на это? Я знаю, что это можно создать с помощью простого сервиса WCF, но в Starter Kit уже есть весь шаблон, так почему бы не использовать его? Как можно подойти к проекту, созданному на основе шаблонов, чтобы добавить поддержку для различных типов ресурсов?

Спасибо.

1 Ответ

2 голосов
/ 13 февраля 2009

Я думаю, что вы переосмыслили стартовый комплект WCF REST. Попробуйте представить себе стартовый комплект WCF REST просто службой WCF, настроенной для простой настройки в среде http. Шаблоны по умолчанию, настроенные для начального набора WCF REST, предназначены для использования в качестве образца. Вам нужно будет просто создать свою собственную подпись или адаптировать ее под свои нужды.

Ключевыми частями, на которых вы хотите сосредоточиться, является код в файле .svc (вы не можете получить к нему двойной щелчок, вам придется выбирать, открывать с помощью) и интерфейсы [ServiceContract]. *

Измените интерфейс [ServiceContract] в предоставленном коде так, чтобы он выглядел так же, как и для обычной службы WCF.

Вот пример ленты новостей ATOM Pub, измененной для ваших нужд

[ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceContract]
public partial class LibraryFeed
{
    public LibraryFeed()
    {
    }

    /// <summary>
    /// Returns an Atom feed.
    /// </summary>
    /// <returns>Atom feed in response to a HTTP GET request at URLs conforming to the URI template of the WebGetAttribute.</returns>
    [WebHelp(Comment = "Gets a list of Books.")]
    [WebGet(UriTemplate = "/books/?numItems={numItems}")]
    [OperationContract]
    public Atom10FeedFormatter GetBooks(int numItems)
    {
        var books = GetBooks();
        List<SyndicationItem> items = GetItems(books, numItems);

        SyndicationFeed feed = CreateFeed(items);

        WebOperationContext.Current.OutgoingResponse.ContentType = ContentTypes.Atom;
        return feed.GetAtom10Formatter();
    }

    /// <summary>
    /// Returns an Atom feed.
    /// </summary>
    /// <returns>Atom feed in response to a HTTP GET request at URLs conforming to the URI template of the WebGetAttribute.</returns>
    [WebHelp(Comment = "Gets a single author.")]
    [WebGet(UriTemplate = "/authors/?numItems={numItems}")]
    [OperationContract]
    public Atom10FeedFormatter GetAuthors(int numItems)
    {
        var authors = GetAuthors();
        List<SyndicationItem> items = GetItems(authors, numItems);

        SyndicationFeed feed = CreateFeed(items);

        WebOperationContext.Current.OutgoingResponse.ContentType = ContentTypes.Atom;
        return feed.GetAtom10Formatter();
    }

    /// <summary>
    /// Returns an Atom feed.
    /// </summary>
    /// <returns>Atom feed in response to a HTTP GET request at URLs conforming to the URI template of the WebGetAttribute.</returns>
    [WebHelp(Comment = "Gets a list of Authors.")]
    [WebGet(UriTemplate = "/authors/{id}")]
    [OperationContract]
    public Atom10FeedFormatter GetAuthor(string id)
    {
        var author = GetSingleAuthor(id);
        WebOperationContext.Current.OutgoingResponse.ContentType = ContentTypes.Atom;
        return GetItem(author.GetAtom10Formatter());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...