我有一个用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中。
答案 0 :(得分:3)
这里的问题是,在.NET后端,您默认启用了内容协商 - 客户端可以向服务询问它“更喜欢”响应的内容类型(通过Accept
标头)。在大多数浏览器中,客户端请求会说它“接受”所有内容,而.NET后端中使用的“首选”格式化程序是将对象转换为线路上的JSON的格式化程序。
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的结果。