2014-10-08 55 views
1

我有一个用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浏览器。

+0

invokeAPI路径中存在一个错误,如果在响应中没有发送Content-Type,它将会出错。它可能是FF对该错误更敏感。你可以尝试更新到1.2.5.js(或1.2.5.min.js),看看问题是否仍然存在? – phillipv 2014-10-08 18:07:37

+0

好的,我已更新到1.2.5.js,问题依然存在。我在invokeAPI方法中添加了一些console.logs,我可以看到在Firefox中,响应以XML编码,而不是JSON编码,因此无法将其转换为FF中的JSON对象。你知道我可以如何强制响应在所有浏览器中都是JSON吗? – Daniel 2014-10-09 07:40:16

回答

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则可以覆盖火狐发送的接受报头,通过直接传递:

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

+0

我最终添加了标头:{Accept:'application/json'}给我的javascript调用,它完美的工作! – Daniel 2014-10-10 07:39:19