从 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 查询非常容易,您可以返回 IEnumerableIListPageResults 或其他任何内容。这是一个例子:

[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的主要内容,如果未能解决你的问题,请参考以下文章

BPM实例分享:DMZ内部网络转发https请求访问微信API

设置了DMZ,外网无法访问

如何才能让内网用户访问到DMZ区的服务器

tplink路由器DMZ设置

网络 DMZ 区和网络安全等级简介

网络 DMZ 区和网络安全等级简介