有没有办法强制WebAPI严格符合已发布的界面?

Jer*_*ing 5 c# asp.net-web-api asp.net-web-api-routing

我试图解决的用例是我们的域模型的封装.例如,我们有一个内部模型,用于后端处理,我们不希望暴露给客户端.这种封装的主要原因之一是变化的波动性,因为我们的域对象可能比"已发布"的客户端模型更快地变化.因此,我们希望将WebApi控制器限制为仅返回"已发布"的客户端模型.

为此,我们需要在WebApi项目之外创建没有内部模型引用的接口,然后在WebAPI控制器上使用这些接口,最后更改路由/过滤以验证所访问的路由/方法是否为界面.

大会A.

public class PublishedModel
{
    public int Foo {get; set;}
    public string Bar {get; set;}
}

public interface IPublishedAPI
{
    PublishedModel GetModel(int id);
}
Run Code Online (Sandbox Code Playgroud)

大会B.

public class MyApi : ApiController, IPublishedAPI
{
    public IDomainManager _manager;

    public MyApi(IDomainManager manager)
    {
        _manager = manager;
    }

    [HttpGet]
    [Route("good/{id}")]
    public PublishedModel Good(int id)
    {
          DomainModel domainModel = _manager.GetDomainModelById(id);
          return new PublishedModel
          {
              Foo = domainModel.Foo,
              Bar = domainModel.Bar,
          }
    }

    [HttpGet]
    [Route("bad/{id}")]
    public DomainModel Bad(int id)
    {
          var domainModel = _manager.GetDomainModelById(id);
          return domainModel;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我想调用/bad/1返回404,因为它是一个未发布的路由.

有任何想法吗?

Nko*_*osi 1

您可以创建一个操作过滤器来检查映射的操作是否是控制器继承接口的成员。

您还可以创建一个过滤器,当手动归因于您不希望公开的方法时,该过滤器会返回 404 Not Found 响应。