2013-07-30 57 views
0

我們正準備創建一個項目,我們希望通過OData和Soap向公衆公開數據(讓我們的API用戶選擇他們想要使用的格式)。我知道Web API允許您公開一個具有IQueryable作爲返回類型的公共操作方法,並且該T值隨後可以從OData中查詢。問題在於我們的Web服務器位於DMZ中,並且不會直接訪問實體框架,因此不能直接訪問IQueryable。通過WCF訪問內部網絡。從DMZ服務器訪問OData

有沒有辦法從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; } 
} 
+0

謝謝你,因爲這是一個很好的例子!但是,這並不是我所要求的。我的OData服務不會直接訪問數據庫,因爲它位於DMZ中,並在域內代理對WCF服務的調用。因此,它返回的任何數據最終都將來自單獨的服務,而不是直接來自數據庫。我想要做的是限制在WCF服務中查詢的數據,而不是全部返回,然後過濾。因此,我希望過濾器,排序等參數轉到內部服務,在那裏過濾數據,然後將結果返回到管道。 –

+0

@JamieNordmeyer技術上你可以在應用程序的任何層運行這段代碼。或者,您可以分解ODataQueryOptions類的各個部分並構建您自己的查詢。 $ top,$ skip等非常容易,當你試圖分解'$ filter'的時候會出現複雜情況。 – qujck

+1

我打算看看這個。 :)我早些時候回覆之後想到了它;我還沒有時間去挖掘它。我會告訴你。 –

0

我建議使用您的實體框架模型創建WCF數據服務,並提供給DMZ服務器的服務。我已經在DMZ服務器上運行了一個網站,使用這種配置已經有幾年了,它運行良好。不過,我承認WCF數據服務確實有一些限制(與直接訪問實體框架相比),你可以如何編寫IQueryable查詢,但似乎每個版本都有所改進。