Created
May 18, 2012 04:16
-
-
Save masaru-b-cl/2723122 to your computer and use it in GitHub Desktop.
WCFクライアント操作をラップしたもの
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
WCFとUsingブロックの問題
http://www.infoq.com/jp/news/2009/03/WCF-Dispose
とか
http://blogs.wankuma.com/naka/archive/2008/12/28/165181.aspx
を参考に