【问题标题】:Azure Mobile Service javascript SDK does not work in FirefoxAzure 移动服务 javascript SDK 在 Firefox 中不起作用
【发布时间】:2014-10-10 03:03:09
【问题描述】:

我有一个用 C# 编写的简单 Azure 移动服务后端,它在/api/CustomLogin 具有登录功能。以下函数是我在 Javascript 中为访问这些数据的 Web 应用程序进行的简单登录测试:

var client = new WindowsAzure.MobileServiceClient(
    URL,
    API_KEY
);

function tryLogin(username, password) {
    client.invokeApi("CustomLogin", {
        body: {
            username: username,
            password: password
        },
        method: "post"
    }).done(function (results) {
        alert(JSON.stringify(results));
    }, function (err) {
        alert("Error: " + err);
    });
}

这在 Chrome 37 和 Internet Explorer 11 上运行良好,并返回带有正确状态码和身份验证令牌的 JSON 对象。但是,当我在 Firefox 32 上运行此测试时,它会返回一个空对象 {},这意味着我没有收到用户信息。我正在使用来自http://ajax.aspnetcdn.com/ajax/mobileservices/MobileServices.Web-1.2.2.min.js 的 Azure 移动服务 SDK。

我已经在 localhost 和已部署的网页(也托管在 Azure 网站)上使用 http 和 https(由 Azure 提供)对此进行了测试,这适用于 Chrome 和 Internet Explorer,但不适用于 Firefox。

Mobile Service API 中的其他函数可以在 Firefox 中使用,例如

var peopleTable = client.getTable('people');
var query = peopleTable.read().done(function (results) {
    alert(JSON.stringify(results));
}, function (err) {
    alert("Error: " + err);
});

这让我怀疑invokeApi 有问题,但我不明白为什么这个问题只出现在 Firefox 中。

【问题讨论】:

  • invokeAPI 路径中存在错误,如果响应中未发送 Content-Type,则会出错。可能是 FF 对那个 bug 更敏感。您可以尝试更新到 1.2.5.js(或 1.2.5.min.js),看看问题是否仍然存在?
  • 好的,我已经更新到1.2.5.js,问题依旧。我在invokeAPI 方法中添加了一些console.logs,我可以看到在Firefox 中响应是用XML 编码的,而不是像Chrome 中那样用JSON 编码的,这就是它无法将其转换为FF 中的JSON 对象的原因。你知道我如何在所有浏览器中强制响应为 JSON 吗?

标签: javascript azure azure-mobile-services


【解决方案1】:

这里的问题是,在 .NET 后端,您默认启用内容协商 - 客户端可以询问服务它“更喜欢”响应哪些内容类型(通过 Accept 标头)。在大多数浏览器中,客户端请求会说它“接受”所有内容,而 .NET 后端中使用的“首选”格式化程序是将对象在线转换为 JSON 的格式化程序。

然而,Firefox 发送一个Accept 标头,表明它更愿意接收XML。后端会很乐意提供帮助,您的 API 调用将接收服务发送的 XML 响应。您甚至可以查看响应的 responseText 属性并在那里看到它。

function tryLogin(username, password) {
    client.invokeApi("CustomLogin", {
        body: {
            username: username,
            password: password
        },
        method: "post"
    }).done(function (response) {
        alert(response.responseText);
    }, function (err) {
        alert("Error: " + err);
    });
}

现在,如果您不想处理 XML(我不会为此责怪您),您有两个选择:在服务器端,从服务器拥有的格式化程序列表中删除 XML 格式化程序。在 WebApiConfig 上,这一行应该可以解决问题:

config.Formatters.Remove(config.Formatters.XmlFormatter);

或者你可以覆盖firefox发送的Accept头,在你调用API时直接传递它:

function tryLogin(username, password) {
    client.invokeApi("CustomLogin", {
        body: {
            username: username,
            password: password
        },
        method: "post",
        headers: { Accept: 'application/json' }
    }).done(function (response) {
        alert(JSON.stringify(response.result));
    }, function (err) {
        alert("Error: " + err);
    });
}

完成此操作后,您将在成功回调参数的 result 属性中获得 API 的结果。

【讨论】:

  • 我最终在我的 javascript 调用中添加了标题:{ Accept: 'application/json' },它运行良好!
猜你喜欢
  • 2018-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多