2015-10-05 141 views
4

我有一個使用Azure AD Graph API的ASP.NET應用程序。通常,當對Graph API執行無效操作時,會引發異常。反序列化OData.Error消息

下面的代碼顯示一個無效的圖形API調用,將觸發異常:

// Query the Azure AD User 
var userToUpdate = await activeDirectoryClient.Users.GetByObjectId("[email protected]").ExecuteAsync(); 

// Set given name to an empty string (not allowed) 
userToUpdate.GivenName = ""; 

try 
{ 
    // Update the user in Azure AD 
    await userToUpdate.UpdateAsync(); 
} 
catch (Exception e) 
{ 
    // Return exception message 
} 

內部異常的消息是JSON字符串與前進的每個引號之前斜槓。它看起來是這樣的:

"{\"odata.error\":{\"code\":\"Request_BadRequest\",\"message\":{\"lang\":\"en\",\"value\":\"Invalid value specified for property 'givenName' of resource 'User'.\"},\"values\":[{\"item\":\"PropertyName\",\"value\":\"givenName\"},{\"item\":\"PropertyErrorCode\",\"value\":\"InvalidValue\"}]}}" 

附加本地窗口的截圖,其中發現異常消息: Exception details

我想這個JSON轉換爲.NET對象返回信息的錯誤細節。我使用的JSON.NET庫這一點,我假定JSON將反序列化到一個ODataError對象:

var error = Newtonsoft.Json.JsonConvert.DeserializeObject<ODataError>(e.InnerException.Message); 

然而,反序列化對象總是具有null的值,這意味着該轉化不按預期工作。

這就是說,上面的JSON字符串映射到哪個類?另外,我是否應該從正確的反序列化中去除字符串中的正斜槓?

+0

你想做什麼?你如何進行OData呼叫以及你使用哪個客戶端?什麼是異常的類型? ODataErrorException已經有[Error](https://msdn.microsoft.com/en-us/library/microsoft.odata.core.odataerrorexception.error(v = vs.113).aspx#P:Microsoft.OData。 Core.ODataErrorException.Error)屬性與反序列化的錯誤。在其他情況下,異常消息將包含客戶端生成的特定消息(可能是在反序列化任何特定錯誤消息之後),而不是原始Json部分。您需要閱讀回覆才能獲得原始json –

+0

Hi @PanagiotisKanavos,謝謝您的評論。我已經用更多的代碼示例更新了這個問題,並且希望我澄清了我正在努力完成的任務。請讓我知道是否需要進一步解釋它的任何部分。 – miguelarcilla

+0

你還沒有解釋 - 拋出異常的類型是什麼?如果它是ODataErrorException,則不必執行任何操作,只需捕獲正確的異常類型即可。至於生Json,你不會在異常對象中找到它。 –

回答

6

你有反序列化後空的原因是你的JSON對象屬性名從Microsoft.Azure.ActiveDirectory.GraphClient.ODataError類的屬性名稱不同 - 「odata.error」屬性不能被反序列化的錯誤Microsoft.Azure.ActiveDirectory.GraphClient.ODataError

財產

至於解決方法我已經添加了我自己的類型正確的反序列化:

internal class ODataError 
    { 
     [JsonProperty("odata.error")] 
     public ODataErrorCodeMessage Error { get; set; } 
    } 

    internal class ODataErrorCodeMessage 
    { 
     public string Code { get; set; } 

     public ODataErrorMessage Message { get; set; } 

     public List<ExtendedErrorValue> Values { get; set; } 
    } 

    internal class ExtendedErrorValue 
    { 
     public string Item { get; set; } 

     public string Value { get; set; } 
    } 

    internal class ODataErrorMessage 
    { 
     public string Lang { get; set; } 

     public string Value { get; set; } 
    } 

之後JSON消息是正確的反序列化:

... 
    try 
    { 
     await ADClient.Users.AddUserAsync(newUser); 
     return Result.Ok(); 
    } 
    catch (DataServiceRequestException ex) 
    { 
     var innerException = ex.InnerException; 
     var error = JsonConvert.DeserializeObject<ODataError>(innerException.Message); 
     return Result.Fail(new Error(error.Error.Message.Value, error.Error.Code, ex)); 
    }