2

この質問の2つの小さな部分で、あいまいさが解消されることを願っています。

まず、WCF サービスを呼び出すにはどちらが適していますか?

using (var myService = new ServiceClient("httpBinding")){
     try{         
          var customerDetails = GetCustomerDetails();
          var results = myService.GetCustomerPurchases(customerDetails);
     }catch(Exception e){
          ......
     }
}

また

var myService = new ServiceClient("httpBinding");
try{
     var customerDetails = GetCustomerDetails();
     var results = myService.GetCustomerPurchases(customerDetails);
}catch(Exception e){
     .......
}

私が疑問に思っているのは、常にサービス呼び出しを using ブロックでラップする必要があるかということです。サービスが例外をスローした場合、IDisposable.Dispose() は呼び出されますか?

4

2 に答える 2

4

この質問を見てください。

また、次のようなクラスをいくつか作成することもできます

public class ClientService<TProxy>
{
    private static ChannelFactory<TProxy> channelFactory = new ChannelFactory<TProxy>("*");

    public static void SendData(Action<TProxy> codeBlock)
    {
        var proxy = (IClientChannel) channelFactory.CreateChannel();
        bool success = false;

        try
        {
            codeBlock((TProxy)proxy);
            proxy.Close();
            success = true;
        }
        finally
        {
            if (!success)
            {
                proxy.Abort();
            }
        }
    }

    public static TResult GetData<TResult>(Func<TProxy, TResult> codeBlock)
    {
        var proxy = (IClientChannel) channelFactory.CreateChannel();
        bool success = false;

        TResult result;
        try
        {
            result = codeBlock((TProxy)proxy);
            proxy.Close();
            success = true;
        }
        finally
        {
            if (!success)
            {
                proxy.Abort();
            }
        }

        return result;
    }
}

public class SomeAnotherService<TProxy>
{
    public static bool SendData(Action<TProxy> codeBlock)
    {
        try
        {
            ClientService<TProxy>.SendData(codeBlock);
            return true;
        }
        catch(Exception ex)
        {
            //...
        }
        return false;
    }

    public static TResult GetData<TResult>(Func<TProxy, TResult> codeBlock)
    {
        TResult result = default(TResult);
        try
        {
            result = ClientService<TProxy>.GetData(codeBlock);
        }
        catch (Exception ex)
        {
            //...
        }

        return result;
    }
}

便利な場合もあります。これは、いくつかのサービス メソッドを呼び出す例です。

var someObj = SomeAnotherService<IMyService>.GetData(x => x.SomeMethod());
于 2012-06-15T08:29:30.523 に答える
2

usingWCF プロキシを扱う場合は使用しないでください。理由の 1 つは、プロキシがオン状態の場合に例外をスローDispose()する呼び出しです。したがって、最適な使用法は次のようになります。Close()Faulted

var myService = new ServiceClient("httpBinding");

try
{
    myService.SomeMethod();
}
catch
{
    // in case of exception, always call Abort*(
    myService.Abort();

    // handle the exception
    MessageBox.Show("error..");
}
finally
{
    myService.Close();
}
于 2012-06-15T08:26:39.400 に答える