在Web API中生成超媒体链接

我很想知道其他人如何处理为他们的Web API生成超媒体链接的问题? 具体来说,我正在使用ASP.NET Web API,并且在操作返回与超媒体相关的类型或返回资源本身之间徘徊,并且在管道中稍后发生超媒体内容。 也就是说,人们倾向于做以下事情:

public Resource GetOrder(int id) { return new Resource() { Content = new Order(), Links = new LinkCollection() { new AddOrderLink(), new UpdateOrderLink()} } 

或者更喜欢的东西

 public Order GetOrder(int id) { return new Order(); } 

然后在HttpOperationHandler或自定义格式化程序或其他内容中添加超媒体链接?

如果方法更像#2,你怎么知道要生成什么链接? 只是为所有Order对象生成一些标准的链接集? 在OrdersController中装饰各种操作的属性?

我更喜欢选项二(在管道中稍后添加超媒体链接)并在博客中谈到昨天这样做 。

解决方案是在使用消息处理程序返回客户端之前,使用超媒体链接“丰富”我的资源。

你可以使用github的Hyprlinkr

我打算在我的下一个项目中使用它,因为它很容易做到并且你可以通过nuget包获得它。

在回答这个问题时,看看ASP.NET MVC处理这个问题的方法是有益的,因为ASP.NET MVC 可能被视为Web API的文本/ html约束版本(尽管手动内容协商),因为它显然严重影响了Web API的设计。

基本上,我们可以使用自定义格式化程序根据路径或操作属性改变表示forms。 ASP.NET MVC将模型与模型分开的方式就是这种方式。 在ASP.NET MVC项目中,单个模型可以由各种视图模板呈现。 这些视图模板中的每一个基本上将过渡链接(锚,forms和链接元素)“硬编码”到模型的特定表示中。 视图模板的选择主要由约定(控制器和操作名称)驱动,但也可以在操作中进行硬编码。

ASP.NET MVC中的视图引擎和视图查找约定可以被视为自定义Web API格式化程序。 这可以概括为使得对于每种支持的媒体类型,自定义格式化器使用路由细节 – 以及可选地应用于调用的动作方法的属性 – 来定义资源状态。 (根据此约定,选择反映资源状态的操作名称是有好处的。)一旦格式化程序知道资源的状态,它就可以委托给特定于州的格式化代码。 在此代码中,将定义特定于状态的链接。

这种特定于州的格式化代码也可以委托给其他子格式,就像Razor视图支持部分视图的组合一样。

我在这里添加了我的解决方案

它使用类和属性属性以及ApiController扩展方法来填充实体中的ResourceLink对象。 它还可以填充任何集合属性的链接。 这不是完成的文章,但它非常直观,将有一个良好的开端。