【问题标题】:OData access from a DMZ server从 DMZ 服务器访问 OData
【发布时间】:2013-07-30 14:17:28
【问题描述】:

我们正准备创建一个项目,希望通过 OData 和 Soap 向公众公开数据(让我们 API 的用户选择他们想要使用的格式)。我知道 Web API 允许您公开一个以 IQueryable 作为返回类型的公共操作方法,然后该 T 值可以从 OData 查询。问题是我们的 Web 服务器位于 DMZ 中,无法直接访问实体框架,因此无法直接访问 IQueryable。通过 WCF 访问内部网络。

有没有办法从 OData 调用接收值,并通过参数将这些值代理到内部网络?我一直在网上搜索,到目前为止,还没有发现任何有用的东西。我在想我只是直接获取查询字符串,将其传递到内部网络,然后使用 PredicateBuilder 之类的东西创建一个 EF 表达式树,然后返回数据。这会起作用,但我想知道是否有更好的方法。

提前致谢!

【问题讨论】:

    标签: wcf entity-framework odata


    【解决方案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 查询方面确实存在一些限制(与直接访问实体框架相比),但似乎随着每个版本的发布有所改进。

    【讨论】:

      猜你喜欢
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2015-01-16
      相关资源
      最近更新 更多