WCF REST入门套件 - 支持多种资源?

时间:2009-02-10 15:15:52

标签: asp.net wcf rest

我刚刚开始修改WCF REST入门套件,我观看了截屏视频......我怀疑我只是愚蠢。 :)开箱即用(使用提供的模板)我可以为单例资源或资源集合创建REST服务。但是对同一项目中不同类型的资源的支持呢?例如,如果我有书籍,我也想要有作者和出版商。使用提供的模板,我看不到一种简单的方法来实现这一点。为每个资源创建一个服务(以及一个VS项目)对我来说听起来很荒谬。我需要在单个服务中支持多种资源类型,以便可以在类似的URL下访问它们,这样用户只需要替换最后一部分,例如 http://service/books 书籍和 http://service/authors/32 以获得特定的作者。

有人可以对此有所了解吗?我知道这可以使用普通的WCF服务创建,但Starter Kit已经具备了所有样板,所以为什么不使用它呢?如何处理模板生成的项目以添加对不同资源类型的支持?

感谢。

1 个答案:

答案 0 :(得分:2)

我认为你过度思考WCF REST入门套件。尝试将WCF REST入门套件视为仅配置为在http环境中轻松设置的WCF服务。为WCF REST入门工具包设置的默认模板旨在用作示例。您必须创建自己的签名或调整他们的签名以满足您的需求。

您需要关注的关键部分是.svc文件中的代码(双击时无法访问它,您必须选择打开)和[ServiceContract]接口。

修改后面提供的代码中的[ServiceContract]接口,使其看起来就像常规WCF服务一样。

以下是根据您的需求修改的ATOM Pub Feed样本

[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());
    }
}