2013-12-11 119 views
1

我有互通MS的WebAPI和ExtJS的的Web API返回的JSON調用XML

問題

ExtJS的確實從

proxy : { 
    type : 'ajax', 
    noCache: false, 
    pageParam: false, 
    startParam: false, 
    limitParam: false, 
    extraParams: { 
     param1 : var1, 
     param2 : var2, 
    }, 
    api: { 
     read : 'api/DataSource', 
    }, 

和我的Web API應用程序返回XML的API調用(我可以看到這螢火蟲)。

[System.Web.Http.AcceptVerbs("GET", "POST")] 
[System.Web.Http.HttpGet] 
public DataModel DataSource(int debug=0) 
{ 
    DataSource dataSource = new dataSource(); 
    ... 
    return dataSource 
} 

只有一個原因,我能想到的,爲什麼會返回XML: Firefox不要求應用程序/ JSON專門就這個ExtJS的JSON調用。 如果我將Firefox的默認AcceptHeaders更改爲更友好的JSON,則返回JSON。因爲用戶不需要改變他的瀏覽器設置,所以我看到兩個解決方案:
- >告訴Javascript要求申請/ json。
- >或告訴MS總是返回json。

我寧願選擇1,但我不知道是否或如何改變這種情況?

+0

您可以發佈控制器操作的代碼嗎? – Maess

+0

哪個控制器? WebAPI控制器或ExtJS控制器? – Alexander

+0

如果你想要Json,你需要webApi操作來返回一個Json結果。 – Maess

回答

2

當你能夠控制什麼獲取傳遞給Ajax請求,您可以覆蓋每個請求的頭:

Ext.Ajax.request({ 
    url: '...', 
    headers: { 'Accept': 'application/json' }, 
    params: { ... }, 
    ... 
}); 

當你不擁有控制權的請求(即它的間接調用在一層store/proxies /等)後,你必須在API中進行挖掘,看看它是否允許你自定義請求的參數。在這種情況下,Ext.data.proxy.AjaxProxy類允許你通過自定義標題:

proxy : { 
    type : 'ajax', 
    headers: { 'Accept': 'application/json' }, // or whatever you need 
    ... 
} 

我不希望有做這一切的地方,所以我決定通過重寫Ext.Ajax單類猴補丁我自己defaultHeaders

Ext.define('MyApp.overrides.core.Ajax', { 
    override: 'Ext.Ajax', 

    defaultHeaders: { 
     'Accept': '*/*' // or whatever you need if this is too liberal 
    } 
}); 

然後,您只需確保在應用程序啓動時加載此類。這樣做會影響每個Ajax請求,即使是通過框架代碼通過Ext.Ajax模塊創建的請求。您的里程可能會因此解決方案而異。

+0

我設置了代理標題,它工作。是否有任何理由爲什麼會使用沒有正確設置爲json的代理標頭的json類型閱讀器? – Alexander

+1

打我。這就是爲什麼我用'*/*'結束了所有的請求,所以我不必去想它。我的ExtJS應用程序不是一個抽象的「代理程序」,所以媒體類型只隱含在我的應用程序的服務層中。我不需要任何討厭的談判。 –

+0

這是一個非常棒的解決方案 –

0

清除配置對象上的formatters集合,然後添加JsonMediaTypeFormatter。

+0

我不確定OP是否可以訪問WebApi來源 – Maess

+0

@Maess你不需要它 –