Azure移动服务javascript SDK在Firefox中不起作用

时间:2014-10-08 10:24:44

标签: javascript azure azure-mobile-services

我有一个用C#编写的简单Azure Mobile Service后端,它具有/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。

Firefox中的移动服务API的其他功能,例如

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

这让我怀疑invokeApi存在问题,但我无法理解为什么这个问题只发生在Firefox中。

1 个答案:

答案 0 :(得分:3)

这里的问题是,在.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);

或者您可以通过在调用API时直接传递它来覆盖firefox发送的Accept标头:

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的结果。