超媒体链接Servicestack新API

我正在评估如何向DTO响应添加超媒体链接。 虽然没有标准,但在响应中添加List DTO似乎是建议的方法 。

您是否知道使用ServiceStack框架的任何实现示例或参考?

添加列表对我来说没问题,但我怀疑的是在哪里放置以下链接的逻辑(在服务或包含状态机的专用类中?)以及解决路由的位置(filter?)

谢谢。

[更新]从ServiceStack版本v3.9.62开始,可以通过EndpointHost.Config.Metadata.Routes.RestPath访问路由配置,因此tgmdbm提供的解决方案可以在不需要“IReturn + Routes属性”的情况下得到改进,只需使用元数据.Routes信息。 实际上,可以查询所有服务元数据并将其用于横切关注点。 Servicestack岩石。

我目前这样做的方式是我传回一个实现接口的响应dto

public interface IHaveLinks { [IgnoreDataMember] IEnumerable Links { get; } } public class Link { public string Name { get; set; } public IReturn Request { get; set; } public string Method { get; set; } } 

然后我使用响应filter生成URL并使用链接填充响应头。

 this.ResponseFilters.Add((req, res, dto) => { if (!(dto is IHaveLinks)) return; var links = (dto as IHaveLinks).Links if(links == null || !links.Any()) return; var linksText = links .Select(x => string.Format("<{0}>; rel={1}"), x.Request.ToUrl(x.Method), x.Name)); var linkHeader = string.Join(", ", linksText); res.AddHeader("Link", linkHeader); }); 

这似乎是最干净的方式。 上面的Link对象有效地说:“如果使用此方法发出此请求,则将返回指定的资源”。 流出BLL的唯一HTTP是Method 。 但你可以摆脱它,只能传回GETurl。 或者将其映射到一些广义的“操作”?

举个例子:

 public class ExampleService : Service { public ExamplesResponse Get(ExamplesRequest request) { var page = request.Page; var data = // get data; return new ExamplesResponse { Examples = data, Links = new [] { new Link { Name = "next", Request = request.AddPage(1), Method = "GET" }, new Link { Name = "previous", Request = request.AddPage(-1), Method = "GET" }, } } } } [Route("/examples/{Page}")] public class ExamplesRequest : IReturn { public int Page { get; set; } // ... } 

AddPage方法返回请求的克隆并适当地设置Page属性。)

希望有所帮助。