簡體   English   中英

Azure移動服務javascript SDK在Firefox中不起作用

[英]Azure Mobile Service javascript SDK does not work in Firefox

我有一個用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。

例如,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的result

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM