Skip to content

Instantly share code, notes, and snippets.

@masaru-b-cl
Created May 18, 2012 04:16
Show Gist options
  • Save masaru-b-cl/2723122 to your computer and use it in GitHub Desktop.
Save masaru-b-cl/2723122 to your computer and use it in GitHub Desktop.
WCFクライアント操作をラップしたもの
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace MyLibrary
{
/// <summary>
/// WCFクライアント呼び出し処理の共通的なエラー処理をラップします。
/// </summary>
public static class WCFServiceClientExtensions
{
/// <summary>
/// WCFサービスを戻り値なしで呼び出します。
/// </summary>
/// <example>
/// 引数を一つとるWCFサービスを呼び出す場合の例を示します。
/// <code>
/// var parameter = "xxx";
/// var client = new MyServiceReference.MyServiceClient();
/// client.Invoke(() =>
/// {
/// client.Update(parameter);
/// });
/// </code>
/// </example>
/// <param name="client">使用するWCFクライアント。</param>
/// <param name="action">WCFクライアントを使って実際にWCFサービスを呼び出す処理を行うActionデリゲート。</param>
public static void Invoke(this ICommunicationObject client, Action action)
{
try
{
client.Open();
action();
}
catch (EndpointNotFoundException)
{
// Open失敗で発生
throw;
}
catch (TimeoutException)
{
// タイムアウトで発生
// 必ずAbort
if (client != null) client.Abort();
throw;
}
catch (CommunicationException)
{
// 通信エラーで発生
// 必ずAbort
if (client != null) client.Abort();
throw;
}
catch (Exception)
{
// その他エラーで発生
// 必ずAbort
if (client != null) client.Abort();
throw;
}
finally
{
// 最後にクローズ
if (client != null) client.Close();
}
}
/// <summary>
/// WCFサービスを戻り値付きで呼び出します。
/// </summary>
/// <example>
/// 引数を一つとるWCFサービスを呼び出し、WCFサービスの結果を編集して返す場合の例を示します。
/// <code>
/// var parameter = "xxx";
/// var client = new MyServiceReference.MyServiceClient();
/// var result = client.Invoke(() =>
/// {
/// var data = client.GetData(parameter);
/// return data.Name; // resultにはこの値が入る
/// });
/// </code>
/// </example>
/// <typeparam name="TResult">WCFサービス呼び出し処理の戻り値の型。</typeparam>
/// <param name="client">使用するWCFクライアント。</param>
/// <param name="func">WCFクライアントを使って実際にWCFサービスを呼び出す処理を行うFuncデリゲート。</param>
/// <returns>Funcデリゲートの戻り値。</returns>
public static TResult Invoke<TResult>(this ICommunicationObject client, Func<TResult> func)
{
try
{
if (client == null) throw new ArgumentNullException("client");
client.Open();
return func();
}
catch (EndpointNotFoundException)
{
// Open失敗で発生
throw;
}
catch (TimeoutException)
{
// タイムアウトで発生
// 必ずAbort
if (client != null) client.Abort();
throw;
}
catch (CommunicationException)
{
// 通信エラーで発生
// 必ずAbort
if (client != null) client.Abort();
throw;
}
catch (Exception)
{
// その他エラーで発生
// 必ずAbort
if (client != null) client.Abort();
throw;
}
finally
{
// 最後にクローズ
if (client != null) client.Close();
}
}
}
}
@masaru-b-cl
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment