从 DMZ 服务器访问 OData
Posted
技术标签:
【中文标题】从 DMZ 服务器访问 OData【英文标题】:OData access from a DMZ server 【发布时间】:2013-07-30 14:17:28 【问题描述】:我们正准备创建一个项目,希望通过 OData 和 Soap 向公众公开数据(让我们 API 的用户选择他们想要使用的格式)。我知道 Web API 允许您公开一个以 IQueryable 作为返回类型的公共操作方法,然后该 T 值可以从 OData 查询。问题是我们的 Web 服务器位于 DMZ 中,无法直接访问实体框架,因此无法直接访问 IQueryable。通过 WCF 访问内部网络。
有没有办法从 OData 调用接收值,并通过参数将这些值代理到内部网络?我一直在网上搜索,到目前为止,还没有发现任何有用的东西。我在想我只是直接获取查询字符串,将其传递到内部网络,然后使用 PredicateBuilder 之类的东西创建一个 EF 表达式树,然后返回数据。这会起作用,但我想知道是否有更好的方法。
提前致谢!
【问题讨论】:
【参考方案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;
【讨论】:
谢谢你,因为它是一个很好的例子!但是,这并不是我要问的。我的 OData 服务无法直接访问数据库,因为它位于 DMZ 中,并且代理调用域内的 WCF 服务。因此,它返回的任何数据最终都来自单独的服务,而不是直接来自数据库。我想做的是限制在 WCF 服务中查询的数据,而不是返回所有数据,然后过滤。所以,我希望过滤、排序等参数转到内部服务,在那里过滤数据,然后将结果返回到管道中。 @JamieNordmeyer 从技术上讲,您可以在应用程序的任何层中运行此代码。或者您可以分解ODataQueryOptions
类的各个部分并构建您自己的查询。 $top、$skip 等非常简单,当你尝试分解$filter
时就会出现复杂情况。
我确实打算看看那个。 :) 我在之前的回复后考虑过;我只是还没有时间去挖掘它。我会告诉你的。【参考方案2】:
我建议使用您的实体框架模型创建 WCF 数据服务,并将该服务提供给 DMZ 服务器。我已经在 DMZ 服务器上运行了一个网站,使用这种配置已经有几年了,而且运行良好。但是,我承认 WCF 数据服务在您如何编写 IQueryable 查询方面确实存在一些限制(与直接访问实体框架相比),但似乎随着每个版本的发布有所改进。
【讨论】:
以上是关于从 DMZ 服务器访问 OData的主要内容,如果未能解决你的问题,请参考以下文章