从DMZ服务器访问OData

时间:2013-07-30 12:23:14

标签: wcf entity-framework odata

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

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

提前致谢!

2 个答案:

答案 0 :(得分: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; }
}

答案 1 :(得分:0)

我建议使用您的Entity Framework模型创建WCF数据服务,并将该服务提供给DMZ服务器。我已经在DMZ服务器上运行了一个网站,使用这种配置已有几年了,而且运行良好。但是,我承认WCF数据服务在如何编写IQueryable查询方面确实存在一些限制(与直接访问实体框架相比),但似乎每个版本都有所改进。