Web API在JSON调用上返回XML

时间:2013-12-11 13:08:32

标签: javascript xml json extjs asp.net-web-api

我在使用MS WebAPI和ExtJS

时遇到问题

ExtJS从

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

我的Web API应用程序返回XML(我可以在FireBug中看到它。)

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

我能想到的原因只有一个,为什么会返回xml: Firefox不会在此ExtJS json调用中专门请求application / json。 如果我将Firefox的默认AcceptHeaders更改为更友好的json,则返回JSON。

由于用户不必更改浏览器设置,我看到两种解决方案:
- >告诉Javascript要求申请/ json。
- >或者告诉MS总是返回json。

我更喜欢选项1,但我不知道是否或如何更改此选项?

2 个答案:

答案 0 :(得分:1)

当您能够控制传递给Ajax请求的内容时,您可以覆盖每个请求的标头:

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

当您无法控制请求时(即它间接地被称为商店/代理/等等层),您必须深入了解API,看它是否允许您自定义请求的参数。在这种情况下,Ext.data.proxy.AjaxProxy类允许您传递自定义标题:

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

我不想在整个地方做到这一点,所以我决定通过覆盖defaultHeaders单身人士课程来单独表达自己的Ext.Ajax

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

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

然后,您必须确保在应用程序引导时加载此类。这样做会影响每个Ajax请求,甚至是框架代码通过Ext.Ajax模块做出的请求。您的里程可能因此解决方案而异。

答案 1 :(得分:0)

清除配置对象上的formatters集合,然后添加回JsonMediaTypeFormatter。