如何将额外的标识符传递给OData Controller

时间:2017-06-11 11:35:42

标签: c# asp.net-web-api2 odata

我有一个名为JobsController的OData控制器。 此控制器表示作业实体

public class Job
{
  int Id {get;set;}
  int Name {get;set;}
...
}

为了进行查询,我需要客户端向我发送一个contextId(数据库标识符)。 通过检查contextId,初始化正确的数据库。 显然,contextId不是Job模型的一部分......

我希望我的控制器看起来像这样:

[HttpGet]
[ODataRoute("Jobs")]
[EnableQuery]
public IHttpActionResult Get()
{
    var unitOfWork = UnitOfWorkFactory.Create(contextId);

    if (unitOfWork == null)
        return InternalServerError(new Exception("Unit of work not found"));

    return Ok(unitOfWork.Jobs.GetAll());
}

我希望我可以查询这样的内容:http://localhost:38483/odata/Jobs('localDb')但不可能

甚至http://localhost:38483/odata/Jobs/localDb

1 个答案:

答案 0 :(得分:0)

首先,这似乎是处理这个问题的一种非常奇怪的方式,有一个可以连接到两个不同数据库的服务似乎令人困惑,你可以设置两个不同的端点吗?

如果确实要求所有人都在一个端点,那么OData对基于您设置的模型/元数据的URL有非常严格的定义,并且您应该能够过滤的任何内容等都应包含在元数据中,以便客户端可以通过仅使用元数据来使用服务。如果要在URL中包含此内容,则必须考虑如何将其应用于元数据。或者,最好,您可以使用自定义标头来实现此目的。

使用自定义标头只是发送标头并从Request对象中在控制器中检索它的情况

要将其包含在您的模型中,我能想到的最好的事情是设置包含的实体,以便您拥有http://localhost:38483/odata/localDb/Jobs/。您可以在此处找到更多信息:https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/odata-containment-in-web-api-22