Javascript Web API在JSON调用时返回XML

Javascript Web API在JSON调用时返回XML,javascript,xml,json,extjs,asp.net-web-api,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: { re

我在使用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中看到这一点)

我只能想到一个原因,即返回xml的原因: Firefox不会在这个ExtJSON调用中特别要求application/json。 如果我将Firefox的默认AcceptHeader更改为更为json友好的,则会返回json

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


我更喜欢选项1,但是我不知道是否可以或者如何更改它?

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

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

当您能够控制传递给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
    ...
}
我不想到处这样做,所以我决定通过覆盖
Ext.Ajax
singleton类来修补我自己的
defaultHeaders

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

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

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

当您能够控制传递给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
    ...
}
我不想到处这样做,所以我决定通过覆盖
Ext.Ajax
singleton类来修补我自己的
defaultHeaders

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

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


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

您可以发布控制器操作的代码吗?哪个控制器?WebAPI控制器或ExtJS控制器?如果您想要Json,您需要WebAPI操作来返回Json结果。如果没有人正确设置和计算这些accept标头,为什么这些标头确实存在?如果您有权访问web api项目,您可以按照Darrel Miller的建议执行以下操作。您可以发布控制器操作的代码吗?哪个控制器?WebAPI控制器还是ExtJS控制器?如果需要Json,您需要webApi操作来返回Json结果。如果没有人正确设置和计算这些accept头,为什么这些accept头会存在?如果您有权访问web api项目,您可以按照Darrel Miller的建议执行以下操作。我不确定OP是否有权访问webApiSource@Maess你不需要itI我不确定OP是否有权访问WebApiSource@Maess您不需要itI设置代理头,它就可以工作了。有没有任何理由可以使用json类型的读卡器而不将代理头正确设置为json?我不明白。这就是为什么我最终用
*/*
来修补我所有的请求,这样我就不用考虑它了。我的ExtJS应用程序不是一个抽象的“代理”,因此媒体类型只是隐式地存在于我的应用程序的服务层中。我不需要讨价还价。这是一个非常好的解决方案。我设置了代理头,它就可以工作了。有没有任何理由可以使用json类型的读卡器而不将代理头正确设置为json?我不明白。这就是为什么我最终用
*/*
来修补我所有的请求,这样我就不用考虑它了。我的ExtJS应用程序不是一个抽象的“代理”,因此媒体类型只是隐式地存在于我的应用程序的服务层中。我不需要讨价还价,这是一个非常愚蠢的解决方案