在 FireFox 中存储 returns 500 的 ExtJS GET 操作

ExtJS GET action to store returns 500 in FireFox

从 Web API GET 请求加载数据时,我从 FireFox 得到了最奇怪的行为,而其他浏览器却完美地做到了这一点。以下是我使用 Firefox 时 Fiddler 可以告诉我的内容:

  3817  500 HTTP    localhost:52543 /api/Tasks/Get?_dc=1442848131483&page=1&start=0&limit=25    5 403   private application/xml; charset=utf-8  firefox:138020  

相同的操作,其他浏览器 (Chrome):

3954   200  HTTP    localhost:52543 /api/Tasks/Get?_dc=1442848159073&page=1&start=0&limit=25    1 508   no-cache; Expires: -1   application/json; charset=utf-8 chrome:2808         

我无法捕获 Application_Error 中的错误,也没有在客户端的异常侦听器中收到错误,所以我怀疑在将结果返回给客户端之间出现了问题和客户端处理结果,但我完全不知道问题出在哪里。

商店定义如下:

Ext.define('SchedulerApp.store.UnplannedTaskStore', {
extend: 'Ext.data.Store',
model: 'UnplannedTask',
autosync: false,
autoLoad: true,
proxy: {
    type: 'rest',
    api: {
        read: '/api/Tasks/Get',
        add: '/api/Tasks/Add',
        update: '/api/Tasks/Update',
        destroy: '/api/Tasks/Destroy'
    },
    actionMethods: {
        create: 'POST',
        read: 'GET',
        update: 'POST',
        destroy: 'POST'
    },
    reader: {
        type: 'json',
        rootProperty: 'data',
        totalProperty: 'total'
    },
    writer: {
        type: 'json',
        writeAllFields: true
    }
},
listeners: {
    load: function (sender, node, records) {
    },
    exception: function (proxy, response, options) {
        Ext.MessageBox.alert('Error', response.status + ": " + response.statusText);
    }
}

});

和模型:

Ext.define('UnplannedTask', {
extend: 'Ext.data.Model',
fields: [
    { name: 'Importance', type: 'float' },
    { name: 'Category', type: 'string' },
    { name: 'TaskNo', type: 'float' }
]

});

这是我在网上看到的 API:

[System.Web.Http.HttpGet]
    public async Task<dynamic> Get(string page, string start, string limit)
    {
        // Get items from database with request information from the Kendo Grid Control
        PagingResult<TaskViewModel> tasks = await this.Worker.GetPagedTasksAsync(int.Parse(page), int.Parse(limit), null, null);

        // Map them to store objects
        var convertedTasks = new SchedulerTasksViewModel()
        {
            total = tasks.Count,
            data = tasks.Items.Select(x => new SchedulerTask()
            {
                Importance = x.Importance,
                Category = x.Category,
                TaskNo = x.TaskNumber
            }).ToArray()
        };

        var response = Request.CreateResponse(HttpStatusCode.OK, convertedTasks);
        return response;
    }

可能是浏览器问题还是我在服务器端遗漏了什么?

尝试将此 header 添加到您的代理:

headers: {'Content-Type': "application/json" }

我想详细说明一下。 XML 序列化器抛出错误;您看不到详细信息,因为 IIS 不会将它们发送到前面。

我建议修改所有 API 调用,使它们也能与 XML 一起工作 - 即使您的前端不使用 XML。如果您可以在新的浏览器选项卡中打开 API 调用并且 XML 序列化程序不会用序列化错误掩盖代码错误,那么调试起来会容易得多。

要查看错误消息,您必须允许您的开发 IIS 将错误带到前面:

  1. 打开IIS7管理器
  2. Select 网站及其功能视图,双击“错误页面”。
  3. 右键单击并select“编辑功能设置...”或select相同的操作窗格(在右侧)
  4. Select“详细错误”单选按钮并单击“确定”

(Source)

我最好的猜测是,您只需使用 [DataContract][DataContractAttribute][DataMemberAttribute] 修饰某些类型或属性。报错信息会告诉你有哪些以及如何装饰。

完全是另一回事:如果您使用多个 Ajax 请求,我建议在 Ajax 代理上定义覆盖。这样你就不会忘记一个:

Ext.define("MyApp.override.Ajax", {
    override:'Ext.data.proxy.Ajax',
    headers:{'Accept':'application/json'}
});