我有一个用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 。
我已经使用Http和https(由Azure提供)在localhost和已部署的网页(也由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中会出现此问题。
这里的问题是,在.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的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句