Web API Helper code: CrmHttpResponseException クラス

 

公開日: 2017年1月

対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

CrmHttpResponseException クラスを使用して、Dynamics 365 Web API の呼び出し中に生成される HTTP ステータス エラー を表します。 このクラスは標準的な .NET システムの Exception クラスから派生していて、既存の例外処理メカニズムと容易に統合できます。 詳細については、「例外処理とスロー」を参照してください。

CrmHttpResponseException クラスは CRM SDK Web API ヘルパー ライブラリ の Exceptions.cs ファイルにあります。 これは他のヘルパー ライブラリ クラスおよび C# Web API サンプルで特に使用されます。 詳細については、「Microsoft Dynamics 365 Web API Helper Library (C#) の使用」を参照してください。

このクラスはオープン ソース Json.NET ライブラリの JSON 文字列操作機能を使用します。

クラス メンバー

次の表は、CrmHttpResponseException クラスのパブリック メンバーを示します。

Dynamics 365 Web API Helper Library-CrmHttpResponseException Class Diagram

CrmHttpResponseException クラス

プロパティ:

StackTrace – 可能な場合、例外がスローされたときに、Dynamics 365 サーバーのコール スタックの即時フレーム値を示す文字列です。


メソッド:

このコンストラクターは、このクラスのインスタンスを初期化します。また HttpContent パラメーターおよび任意の内部例外パラメーターが必要です。

ExtractMessageFromContent – この静的メソッドは、指定された HTTP コンテンツ パラメーターからエラー メッセージを抽出します。

使用法

通常は、HTTP 応答メッセージと共に返されたステータス エラーを処理する場合に、CrmHttpResponseException オブジェクトを作成してスローします。 たとえば、次のコードは WhoAmI Function 関数呼び出しに失敗した場合に、このようなエラーがスローされます。

response = await httpClient.GetAsync("WhoAmI", HttpCompletionOption.ResponseContentRead);
if (!response.IsSuccessStatusCode)
{ 
    throw new CrmHttpResponseException(response.Content); 
}

他の標準的な .NET の例外と同様に、スローされた CrmHttpResponseException オブジェクトをキャッチおよび処理できます。

重要

HttpResponseMessage.EnsureSuccessStatusCode メソッドを使用して、HTTP 応答エラーをスローされた HttpRequestException オブジェクトに自動的に変換する場合、この方法では、CrmHttpResponseException クラスが使用できません。 この方法を使用する場合、ステータス コードを含む応答メッセージの詳細の多くは、例外処理時には使用できないことに注意してください。

クラスの一覧

このクラスの最新のソースは、CRM SDK Web API Helper Library NuGet パッケージにあります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Microsoft.Crm.Sdk.Samples.HelperCode
{
    /// <summary>
    /// Produces a populated exception from an error message in the content of an HTTP response. 
    /// </summary>
    public class CrmHttpResponseException : System.Exception
    {
        #region Properties
        private static string _stackTrace;

        /// <summary>
        /// Gets a string representation of the immediate frames on the call stack.
        /// </summary>
        public override string StackTrace
        {
            get { return _stackTrace; }
        }
        #endregion Properties

        #region Constructors
        /// <summary>
        /// Initializes a new instance of the CrmHttpResponseException class.
        /// </summary>
        /// <param name="content">The populated HTTP content in Json format.</param>
        public CrmHttpResponseException(HttpContent content)
            : base(ExtractMessageFromContent(content)) { }

        /// <summary>
        /// Initializes a new instance of the CrmHttpResponseException class.
        /// </summary>
        /// <param name="content">The populated HTTP content in Json format.</param>
        /// <param name="innerexception">The exception that is the cause of the current exception, or a null reference
        /// if no inner exception is specified.</param>
        public CrmHttpResponseException(HttpContent content, Exception innerexception)
            : base(ExtractMessageFromContent(content), innerexception) { }

        #endregion Constructors

        #region Methods
        /// <summary>
        /// Extracts the CRM specific error message and stack trace from an HTTP content. 
        /// </summary>
        /// <param name="content">The HTTP content in Json format.</param>
        /// <returns>The error message.</returns>
        private static string ExtractMessageFromContent(HttpContent content)
        {
            string message = String.Empty;
            string downloadedContent = content.ReadAsStringAsync().Result;
            if (content.Headers.ContentType.MediaType.Equals("text/plain"))
            {
                message = downloadedContent;
            }
            else if (content.Headers.ContentType.MediaType.Equals("application/json"))
            {
                JObject jcontent = (JObject)JsonConvert.DeserializeObject(downloadedContent);
                IDictionary<string, JToken> d = jcontent;

                // An error message is returned in the content under the 'error' key. 
                if (d.ContainsKey("error"))
                {
                    JObject error = (JObject)jcontent.Property("error").Value;
                    message = (String)error.Property("message").Value;
                }
                else if (d.ContainsKey("Message"))
                    message = (String)jcontent.Property("Message").Value;

                if (d.ContainsKey("StackTrace"))
                    _stackTrace = (String)jcontent.Property("StackTrace").Value;
            }
            else if (content.Headers.ContentType.MediaType.Equals("text/html"))
            {
                message = "HTML content that was returned is shown below.";
                message += "\n\n" + downloadedContent;
            }
            else
            {
                message = String.Format("No handler is available for content in the {0} format.",  
                    content.Headers.ContentType.MediaType.ToString());
            }
            return message;
            #endregion Methods
        }
    }
}

関連項目

Microsoft Dynamics 365 Web API (C#) を開始する
Visual Studio (C#) で Dynamics 365 Web API プロジェクトを起動する
Microsoft Dynamics 365 Web API Helper Library (C#) の使用
Web API Helper code: 認証クラス
Web API Helper code: 構成クラス

Microsoft Dynamics 365

© 2017 Microsoft. All rights reserved. 著作権