Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure移动服务javascript SDK在Firefox中不工作_Javascript_Azure_Azure Mobile Services - Fatal编程技术网

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

Azure移动服务javascript SDK在Firefox中不工作,javascript,azure,azure-mobile-services,Javascript,Azure,Azure Mobile Services,我有一个用C编写的简单Azure移动服务后端,它在/api/CustomLogin上具有登录功能。以下函数是我用Javascript为访问这些数据的web应用程序进行的简单登录测试: var client = new WindowsAzure.MobileServiceClient( URL, API_KEY ); function tryLogin(username, password) { client.invokeApi("CustomLogin", {

我有一个用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);
    });
}
这在Chrome37和InternetExplorer11上运行良好,并返回带有正确状态码和身份验证令牌的JSON对象。但是,当我在Firefox32上运行这个测试时,它返回一个空对象
{}
,这意味着我没有收到用户信息。我正在使用来自的Azure移动服务SDK

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

例如,来自移动服务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
headers)。在大多数浏览器中,客户端请求会说它“接受”了所有内容,而.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);
    });
}

一旦您这样做,您的API的结果就会出现在成功回调参数的
result
属性中。

invokeAPI路径中有一个错误,如果响应中没有发送内容类型,它就会出错。可能是FF对该错误更敏感。您可以尝试更新到1.2.5.js(或1.2.5.min.js)吗看看问题是否仍然存在?好的,我已经更新到1.2.5.js,问题仍然存在。我在invokeAPI方法中添加了一些console.log,我可以看到在Firefox中,响应是用XML编码的,而不是像Chrome那样用JSON编码的,这就是为什么它无法在FF中将其转换为JSON对象的原因。你知道如何强制响应为J吗在所有浏览器中运行吗?我最后在javascript调用中添加了标题:{Accept:'application/json'},效果非常好!