我们正准备创建一个项目,我们希望通过OData和Soap向公众公开数据(让我们的API用户选择他们想要使用的格式)。我知道Web API允许您公开一个具有IQueryable作为返回类型的公共操作方法,然后该T值可以从OData中查询。问题是我们的Web服务器位于DMZ中,并且不能直接访问Entity Framework,因此无法直接访问IQueryable。通过WCF访问内部网络。
有没有办法从OData调用接收值,并通过参数将这些值代理到内部网络?我一直在搜索互联网,到目前为止,还没有找到任何有用的东西。我以为我只是直接获取查询字符串,将其传递给内部网络,然后使用类似PredicateBuilder的东西来创建EF表达式树,并返回数据。这可行,但我想知道是否有更好的方法。
提前致谢!
答案 0 :(得分:1)
自己处理OData查询非常容易,您可以返回IEnumerable
,IList
,PageResults
或其他任何内容。这是一个例子:
[HttpGet]
[ActionName("Example")]
public IEnumerable<Poco> GetExample(ODataQueryOptions<Poco> queryOptions)
{
//simulate an EF DbSet for the example
var data = new Poco[] {
new Poco() { id = 1, name = "one", type = "a" },
new Poco() { id = 2, name = "two", type = "b" },
new Poco() { id = 3, name = "three", type = "c" }
};
var t = new ODataValidationSettings() { MaxTop = 2 };
queryOptions.Validate(t);
var s = new ODataQuerySettings() { PageSize = 1 };
var results = queryOptions
.ApplyTo(data.AsQueryable(), s) as IEnumerable<Poco>;
return results;
}
public class Poco
{
public int id { get; set; }
public string name { get; set; }
public string type { get; set; }
}
答案 1 :(得分:0)
我建议使用您的Entity Framework模型创建WCF数据服务,并将该服务提供给DMZ服务器。我已经在DMZ服务器上运行了一个网站,使用这种配置已有几年了,而且运行良好。但是,我承认WCF数据服务在如何编写IQueryable查询方面确实存在一些限制(与直接访问实体框架相比),但似乎每个版本都有所改进。