【问题标题】:Web API returns XML on JSON callWeb API 在 JSON 调用上返回 XML
【发布时间】:2013-12-29 11:25:57
【问题描述】:

我在使用 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 更友好的 AcceptHeaders,则会返回 JSON。

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

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

【问题讨论】:

  • 你能发布控制器动作的代码吗?
  • 哪个控制器? WebAPI 控制器还是 ExtJS 控制器?
  • 如果你想要 Json,你需要 webApi 动作来返回一个 Json 结果。
  • 如果没有人正确设置和评估它们,为什么这些接受头存在?
  • 如果您可以访问 web api 项目,您可以按照 Darrel Miller 下面的建议进行操作。

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


【解决方案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
    ...
}

我不想到处都这样做,所以我决定通过覆盖 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 模块发出的请求。您的里程可能会因此解决方案而异。

【讨论】:

  • 我设置了代理头,它可以工作。是否有任何理由使用 json 类型的阅读器而没有将代理标头正确设置为 json?
  • 击败我。这就是为什么我最终用*/* 对我的所有请求进行了猴子修补,所以我不必考虑它。我的 ExtJS 应用程序不是一个抽象的“代理”,所以媒体类型只是隐含在我的应用程序的服务层中。我不需要讨厌的谈判。
  • 这是一个非常好的解决方案
【解决方案2】:

清除配置对象上的格式化程序集合,然后添加回 JsonMediaTypeFormatter。

【讨论】:

  • 我不确定 OP 是否可以访问 WebApi 源
  • @Maess 你不需要它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 2013-01-14
相关资源
最近更新 更多