我刚刚开始修改WCF REST入门套件,我观看了截屏视频......我怀疑我只是愚蠢。 :)开箱即用(使用提供的模板)我可以为单例资源或资源集合创建REST服务。但是对同一项目中不同类型的资源的支持呢?例如,如果我有书籍,我也想要有作者和出版商。使用提供的模板,我看不到一种简单的方法来实现这一点。为每个资源创建一个服务(以及一个VS项目)对我来说听起来很荒谬。我需要在单个服务中支持多种资源类型,以便可以在类似的URL下访问它们,这样用户只需要替换最后一部分,例如 http://service/books 书籍和 http://service/authors/32 以获得特定的作者。
有人可以对此有所了解吗?我知道这可以使用普通的WCF服务创建,但Starter Kit已经具备了所有样板,所以为什么不使用它呢?如何处理模板生成的项目以添加对不同资源类型的支持?
感谢。
答案 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());
}
}