2013-07-04 74 views
0

我使用一種方法將CORS處理程序添加到由客戶機使用Breeze調用的響應中。如何在CORS中使用Breeze IQueryable?

您可以瞭解更多關於如何我得到了在這裏工作:但是Controller not filtering data in Breeze query in DotNetNuke Module

,我注意到,雖然$篩選器的工作,$擴大和$選擇沒有。

所以我的問題是:我怎樣才能使用返回一個HttpResponseMessage類型,仍然使用微風(我需要這樣做的CORS)。

爲了證明這一點,我下載並改變了託多斯樣本:

原來的方法(作品)

http://example/api/todos/todos?$select=isdone 
[HttpGet] 
public IQueryable<TodoItem> Todos() 
{ 
    return _contextProvider.Context.Todos; 
} 

我與CORS包裝方法(不展開或選擇)

http://example/api/todos/TodosCors?$select=isdone 
[HttpGet] 
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)] 
public HttpResponseMessage TodosCors() 
{ 
    var response = Request.CreateResponse(HttpStatusCode.OK, (IQueryable<TodoItem>)_contextProvider.Context.Todos); 
    return ControllerUtilities.GetResponseWithCorsHeader(response); 
} 

    public static HttpResponseMessage GetResponseWithCorsHeader(HttpResponseMessage response) 
    { 
     response.Headers.Add("Access-Control-Allow-Origin", "*"); 
     return response; 
    } 

回答

1

我打算主要評論你的問題的CORS方面。關於$ expand和$ select的部分在the StackOverflow question to which you refer中解決。簡而言之,[Queryable]是不支持$ expand和$ select的Web API屬性。我想你想要的[BreezeQueryable]屬性。

我不能肯定地說,但我不相信你展示的代碼是實現Web API CORS的正確方法。至少我沒有看到這樣做。

我知道有兩種方法;都涉及到添加消息處理程序。

第一種是我們在Breeze Todo樣品中做到的方式;第二個是具有Web API CORS支持的方式。

我們這樣做的方式簡單但有效。我們不談論它,因爲我們打算在它到達時很快遵循批准的Web API方式(很快我希望)。

藤堂演示,尋找App_Start/BreezeSimpleCorsHandler.cs。您可以將它複製到您自己的App_Start文件夾中,除了命名空間外,沒有任何更改。

然後你的服務器必須調用它。在Todo示例中,我們是在BreezeWebApiConfig.cs中這樣做的,但是您可以將它放在Global.asax的或任何屬於服務器引導邏輯的部分。

 
     // CORS enabled on this server 
     GlobalConfiguration.Configuration.MessageHandlers.Add(new BreezeSimpleCorsHandler()); 

碰巧,有人曾試圖與即將舉行的Web API CORS NuGet包微風......在微風發現了一個錯誤。我們必須通過......來努力,而且我們會。我們真的希望這種方式成爲現實。

在此之前,您可以按照Todo示例先例。

+0

感謝病房,我一直在玩Todos List中的CORS示例 - 是否有任何理由說爲「CORS支持的全局消息處理程序(僅限開發)」 - 即。這只是一個免責聲明,或者我真的不應該在生產中使用這種方法(即使它工作正常?)。我最初的問題是試圖讓Breeze與DotNetNuke一起工作,這可能不允許我將代碼放在AppStart中,這就是爲什麼我想動態地添加Response Header的原因。今晚我會看看這一切,謝謝! – Rodney

+0

ps - 我看到了即將到來的CORS在ASP.NET中的支持,並且耐心地等待着;)現在我明白了。 IQUeryable:所以核心標籤不支持擴展和選擇(因此不是一種選擇),而BreezeQueryable則是這樣,所以我需要使用這個 – Rodney

+0

所有的作品都很棒,謝謝。我注意到的一件事是,當我用[NOTMAPPED]排除EF Code First中的屬性時,它反映在MetaData Controller調用中(不提及該字段),但IQueryable列表返回該屬性(但具有NULL值)。這對我來說似乎很陌生... – Rodney

相關問題