Azure移动服务javascript SDK在Firefox中不起作用
我有一个用C#编写的简单的Azure移动服务后端,其登录功能为/api/CustomLogin
。下面的函数是一个简单的登录测试,我在Javascript中我替我的网络应用程序,它访问这些数据:Azure移动服务javascript SDK在Firefox中不起作用
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对象具有正确的StatusCode和认证令牌。但是,当我在Firefox 32上运行此测试时,它会返回空对象{}
,这意味着我没有收到用户信息。我正在使用http://ajax.aspnetcdn.com/ajax/mobileservices/MobileServices.Web-1.2.2.min.js的Azure移动服务SDK。
我已经使用http和https(由Azure提供)在本地主机和部署的网页(也在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浏览器。
这里的问题是,在.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则可以覆盖火狐发送的接受报头,通过直接传递:
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的结果。
我最终添加了标头:{Accept:'application/json'}给我的javascript调用,它完美的工作! – Daniel 2014-10-10 07:39:19
invokeAPI路径中存在一个错误,如果在响应中没有发送Content-Type,它将会出错。它可能是FF对该错误更敏感。你可以尝试更新到1.2.5.js(或1.2.5.min.js),看看问题是否仍然存在? – phillipv 2014-10-08 18:07:37
好的,我已更新到1.2.5.js,问题依然存在。我在invokeAPI方法中添加了一些console.logs,我可以看到在Firefox中,响应以XML编码,而不是JSON编码,因此无法将其转换为FF中的JSON对象。你知道我可以如何强制响应在所有浏览器中都是JSON吗? – Daniel 2014-10-09 07:40:16