5

Azure AD Graph API を使用する ASP.NET アプリケーションがあります。多くの場合、Graph API に対して無効な操作が実行されると、例外がスローされます。

次のコードは、例外をトリガーする無効な Graph API 呼び出しを示しています。

// Query the Azure AD User
var userToUpdate = await activeDirectoryClient.Users.GetByObjectId("user@domain.net").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\"}]}}"

例外メッセージが見つかった [ローカル] ウィンドウのスクリーンショットを添付します。 例外の詳細

この JSON を .NET オブジェクトに変換して、有益なエラーの詳細を返したいと考えています。これには JSON.NET ライブラリを使用しており、JSON がODataErrorオブジェクトに逆シリアル化されると想定しています。

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

ただし、逆シリアル化されたオブジェクトの値は常に ですnull。これは、変換が期待どおりに機能していないことを意味します。

そうは言っても、上記の JSON 文字列はどのクラスにマップする必要がありますか? また、適切な逆シリアル化のために文字列からスラッシュを削除する必要がありますか?

4

1 に答える 1

8

逆シリアル化後に null を取得した理由は、JSON オブジェクト プロパティ名がクラス プロパティ名と異なるためです。Microsoft.Azure.ActiveDirectory.GraphClient.ODataError"odata.error" プロパティは、Microsoft.Azure.ActiveDirectory.GraphClient.ODataError の Error プロパティに逆シリアル化できません。

回避策として、正しい逆シリアル化のために独自の型を追加しました。

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));
    }
于 2015-11-19T12:42:57.847 に答える