2014-09-25 90 views
1

我遵循以下文檔中的步驟http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-get-started-custom-authentication/ 並構建了我的.NET後端 - 我已經能夠使用移動服務的新CustomRegistration和CustomLogin函數 各自的api頁面localhost:<portNumber>/help/Api/POST-api-CustomLogin處的「試用」按鈕。 ./CustomRegistration。我已經發布了這些channges到我的天藍色移動服務的服務。Android客戶端自定義登錄Azure移動服務(.NET後端)

我然後嘗試使用我在Android Studio中構建的Android應用程序連接到該服務。我對Android非常陌生,因此我很難讓我的應用使用我的移動服務提供的CustomLogin 。下面爲Android APP

在Java/com.example.howzit文件夾的代碼:

LoginResult.java

package com.example.howzit; 

import com.google.gson.annotations.SerializedName; 

public class LoginResult { 

    public String AuthenticationToken; 
    // 
    // Summary: 
    //  Gets or sets the Microsoft.WindowsAzure.Mobile.Service.Security.LoginResultUser 
    //  logged in. 
    public LoginResultUser User; 

} 

LoginResultUser.java

package com.example.howzit; 

import com.google.gson.annotations.SerializedName; 

public class LoginResultUser { 
    public String UserId ; 
} 

LoginRequest.java

package com.example.howzit; 
    public class LoginRequest 
    { 
     public String username ; 
     public String password ; 
    } 

在TodoActivity類我有這樣的:

mClient = new MobileServiceClient(
        "https://mysite.azure-mobile.net/", 
        "APIKEY", 
        this).withFilter(new ProgressFilter()) 
      .withFilter(new RefreshTokenCacheFilter()); 

     LoginRequest loginUser = new LoginRequest(); 
      loginUser.username = "theUserName"; 
      loginUser.password = "thePassword"; 

       mClient.invokeApi("CustomLogin",loginUser,LoginResult.class, new ApiOperationCallback<LoginResult>() { 
        @Override 
        public void onCompleted(LoginResult result,Exception error, ServiceFilterResponse response){ 
         if (error != null) { 
            createAndShowDialog(error, "Error"); 
           } 
           else { 
            createAndShowDialog(result.User.UserId, "User"); 
           } 
        } 
       }); 

我已經調試這一點,它基本上打invokeApi呼叫並繼續加載應用程序從未擊中onCompleted例程的其餘部分 ......在Android Studio中我有訪問LogCat,但沒有任何信息可以告訴我一個錯誤。我真的無法深究這一點。我已成功實施了Google登錄提供程序以及Window Azure 提供程序,但無法使用我自己的自定義登錄名。任何幫助將不勝感激。

更多信息:我已經在VS2013上設置了遠程調試,如果我刪除身份驗證和調試,使用android應用程序時會觸發斷點,但使用身份驗證時,控制器中的CustomLogin Post永遠不會被擊中。

+0

我已經完成了與Windows Phone的自定義登錄身份驗證,但不是Android,所以我可能會離開。當您連接到CustomLogin時,登錄API是https://mysite.azure-mobile.net/api/CustomLogin。我知道桌面控制器都是用/ tables/....命令調用api是否需要api/CustomLogin?或者你可以使用Fiddler或其他東西來查看它嘗試的URL。 – 2014-09-30 15:46:58

+0

@亞當我已經嘗試了一切(與API /和沒有) - 不能使用小提琴手,因爲我的調試設備是我的android手機。不能在我的機器上使用仿真器,因爲它永遠不會加載.-我已經基本放棄了,因爲我沒有從adroid studio調試器反饋意見,說出了什麼問題 - 非常令人沮喪 – Paul 2014-10-01 13:49:21

+0

它實際上是否在另一端觸發了API 。例如。在CustomLogin方法上放置一個斷點。第一個要點是查明它是否已經到達API以及錯誤是在那裏連接還是在發回信息。 – 2014-10-02 00:59:47

回答

1

我在同一個地方卡住這裏與Android使用相同的教程+ .NET + CustomAuthentication。 「試一試」的工作,但Android應用程序不會。 我試過亞當的答案,但它沒有幫助。

挖/閒逛了幾個小時後,我用了Android的調試器,並保持進入SDK代碼,直到我發現有一個與JSON解析到LoginResult.class

COM \谷歌問題\ GSON \內部\綁定\ ReflectiveTypeAdapterFactory.java

try { 
    in.beginObject(); 
    while (in.hasNext()) { 
     String name = in.nextName(); 
     BoundField field = boundFields.get(name); 
     if (field == null || !field.deserialized) { 
     in.skipValue(); 
     } else { 
     field.read(in, instance); 
     } 
    } 
    } catch (IllegalStateException e) { 
    throw new JsonSyntaxException(e); 
    } catch (IllegalAccessException e) { 
    throw new AssertionError(e); 
    } 

看來,.NET序列化JSON與Android不同的初始字母

我的工作代碼對本教程之後,

.NET CustomLoginResult.cs

public class CustomLoginResult 
{ 
    public string UserId { get; set; } 
    public string MobileServiceAuthenticationToken { get; set; } 

} 

的Android CustomLoginResult.java

public class CustomLoginResult { 
    public String userId; 
    public String mobileServiceAuthenticationToken; 
} 

注意首字母是不同的,在Java變量名必須爲,正好與相同,「試試這個「結果體。 enter image description here

不知道這是否解決了這個問題,保羅很可能早就離開/解決了這個問題,但我希望這可以幫助任何人堅持在同一個地方。

+0

吉姆 - 是的,我發現JSon和這個類的屬性名稱是這個問題......正如你上面討論的那樣 – Paul 2015-08-16 14:49:41

0

只是把這個問題放在一個更清晰的答案中,即使不確定它是否是正確的答案。

嘗試把

[AuthorizeLevel(AuthorizationLevel.Anonymous)] 
[Route("api/Account/CustomLogin")] 
[HttpPost] 

如上您的自定義API控制方法的屬性,然後嘗試調用/ API /帳號/ CustomLogin

+0

謝謝我'我今晚會試試這個。只是爲了讓你知道......如果我使用測試客戶端(web界面)並在界面中使用JSON發送自定義登錄請求,那麼它的所有成功 – Paul 2014-10-02 11:31:23

+0

好吧,那麼它看起來像是SDK。只是爲了檢查,你有最新版本的一切嗎? – 2014-10-02 13:17:06

+0

我已經嘗試了上述但沒有喜悅 - 謝謝你的建議 - 我已經在過去兩週內下載了所有東西,所以我相信每個包都是最新的 – Paul 2014-10-02 22:01:15

1

我有同樣的問題。亞當的回答非常有幫助! 但是,您無需致電/api/Account/CustomLogin,您需要致電帳戶/ CustomLogin/

mClient.invokeApi("Account/CustomLogin/",...

然後,代碼絕對應該在你的後臺調用。可能仍然是這樣,你不會從後端獲得返回值。爲了解決這個問題,這個問題可能會有所幫助:

Android and Azure Mobile Services: Using invokeAPI to return recordset

相關問題