2017-05-07 83 views
2

我使用Xamarin中的脫機同步功能在我的移動應用程序和託管在Azure上的MobileAppService之間同步數據。 我使用了Entity Framework(V6.1.3),使用Visual Studio包管理器使用代碼優先的遷移創建了我的數據庫。數據庫是Azure上託管的Microsoft SQL Server。 當我使用脫機同步時,數據插入到數據庫中沒有問題。但是,當我直接調用web API和JSON發送對象,執行InserAsync當服務器拋出未知異常(我連接調試器在Azure上運行MobileAppService找出哪些命令導致的問題):ASP .Net - 實體框架 - MobileAppService - 將實體對象推送到後端時出錯

拋出異常:「System.Web.Http.HttpResponseException」在mscorlib.dll

的API端點代碼只是如下:

public async Task<IHttpActionResult> PostUser([FromBody] User item) 
    {    
     User current = await InsertAsync(item);    
     return CreatedAtRoute("Tables", new { id = current.Id , CreatedAt = System.DateTime.Now }, current); 
    } 

這是我如何打電話在我的API Xamarin客戶端:

var JsonContent = JsonConvert.SerializeObject(user); 
var httpContent = new StringContent(JsonContent, System.Text.Encoding.UTF8, "application/json");      
var response = await httpClient.PostAsync("tables/User/PostUser", httpContent); 

令人震驚的是,如果我使用郵遞員調用相同的api入口點,一切工作正常。我很困惑,不能將其他任何事情視爲這個問題的根源。

我發現了web api拋出的異常,並檢查了值。這裏是監視窗口中遠程調試模式下的截圖: Watch view of remote debug

錯誤可能與AzureVersion的價值,但我沒有任何想法如何解決它,因爲版本的請求消息設置爲1.1(當我通過郵遞員調用API時也是如此)。

+0

你能發表一些代碼嗎?你使用的是什麼版本的實體框架?什麼類型的數據庫? –

回答

1

該問題來自使用AppServiceHelpers.Models.EntityData,它作爲NuGet包安裝。我的實體都來自EntityData它增加了一些屬性的實體,其中之一是AzureVersion繼承:

public class EntityData 
{   
    ...  
    [Version] 
    public string AzureVersion { get; set; } 
} 

AzureVersion標有屬性[Version]Microsoft.WindowsAzure.MobileServices.Version)。但是,JsonConvert未實現此屬性並將名稱AzureVersion分配給序列化對象中的此屬性(而不是Version),後者未在後臺的MobileServiceContext中定義。

爲了解決這個問題,我定義我自己EntityData輔助類,並明確指定的屬性名稱Version

public class MyEntityData 
{   
    [Version] 
    [JsonProperty(PropertyName = "Version")] 
    public string AzureVersion { get; set; } 
} 

沒有此解決方案,上下文只適用於OfflineSync;因爲Version屬性由MobileServiceClient.SyncContext實現,並且該對象存儲在本地SQLStore中,該屬性正確設置爲Version,然後推送到SyncContext.PushAsync()後面的後端。但是,如果將對象直接推入後端,則該屬性將保留未識別的名稱AzureVersion

1

根據你的描述,我從Microsoft.Azure.Mobile.Server.dll檢查InsertAsync方法,我發現這個錯誤可能是由幾種例外情況引起(例如DbEntityValidationExceptionDbUpdateConcurrencyExceptionDbUpdateException等)保存數據到數據庫時。爲了找到這個問題,你需要捕捉詳細的錯誤信息,你可以按照下面的方法:

  • 使用Fiddler從響應獲取詳細的錯誤如下:

enter image description here

  • Remote debug你的web應用程序,你可以用try-catch包裹InsertAsync捕獲詳細的錯誤如下:

enter image description here

總之,你可以嘗試找到特定的錯誤並解決它。或者您可以提供有關此問題的更詳細的錯誤信息,以便我們找到它。

+0

問題根據您的建議進行更新。 – AHA

+0

1.1版適用於HTTP。基於你的屏幕截圖,我發現了一個關於ModelState的錯誤,用'item.AzureVersion',你是否在你的用戶實體中定義了這個屬性?我窺視了你的後端URL,我可以直接用用戶信息'{id:「005012c8577c46beb3a9140000000000」,密碼:「test」,email:「test」}'調用'tables/User/PostUser'。我認爲既然脫機同步可以工作,你發佈的'JsonContent'可能無效,請檢查它。 –