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 クラスのパブリック メンバーを示します。
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. 著作権