3

我在我的 ASP.NET MVC 应用程序中使用 WCF,并且我的每个方法都包含 try-catch-finally 块。我想知道我是否正确关闭/中止 WCF 调用。我知道“使用”语句不适合 WCF 调用。

这是示例方法

public int GetInvalidOrdersCount()
{
    OrderServiceClient svc = new OrderServiceClient();
    try
    {
        return svc.GetInvalidOrdersCount();
    }
    catch (Exception)
    {
        svc.Abort();
    throw;
    }
    finally
    {
        svc.Close();
    }
}
4

3 回答 3

1

msdn上,它显示了一个“正确”调用方式的示例:

CalculatorClient wcfClient = new CalculatorClient();
try
{
    Console.WriteLine(wcfClient.Add(4, 6));
    wcfClient.Close();
}
catch (TimeoutException timeout)
{
    // Handle the timeout exception.
    wcfClient.Abort();
}
catch (CommunicationException commException)
{
    // Handle the communication exception.
    wcfClient.Abort();
}

在实现客户端时,我通常遵循这种模式。除了,您可能还想using为客户处理:

using (CalculatorClient wcfClient = new CalculatorClient())
{
    try
    {
        return wcfClient.Add(4, 6);
    }
    catch (TimeoutException timeout)
    {
        // Handle the timeout exception.
        wcfClient.Abort();
    }
    catch (CommunicationException commException)
    {
        // Handle the communication exception.
        wcfClient.Abort();
    }
}
于 2013-03-07T13:45:57.167 回答
1

我使用类似WcfUsingWrapper下面的东西,然后包装我所有的代理实例

    void Foo(){

        var client = new WcfClientType();
        var result = ExecuteClient(client, x => x.WcfMethod());

      }

    public static ReturnType ExecuteClient<ReturnType>(ClientType client, Func<ClientType, ReturnType> webServiceMethodReference)
where ClientType : ICommunicationObject
    {
        bool success = false;
        try
        {
            ReturnType result = webServiceMethodReference(client);
            client.Close();
            success = true;
            return result;
        }
        finally
        {
            if (!success)
            {
                client.Abort();
            }
        }
    }
于 2013-03-08T13:39:56.363 回答
0

您要做的一件事是检查连接的“状态”。如果通道处于故障状态,则需要在关闭前调用 Abort() 方法,否则通道会在一段时间内保持故障状态。如果通道没有故障,只需调用 Close() 即可。然后将其设置为空。

像这样的东西:

 if (requestChannel != null) {
    if (requestChannel.State == System.ServiceModel.CommunicationState.Opened) {
        requestChannel.Close();
        requestChannel = null;
    }

    if (requestChannel.State == System.ServiceModel.CommunicationState.Faulted) {
        requestChannel.Abort();
        requestChannel.Close();
        requestChannel = null;
    }
 }
于 2013-03-08T13:28:12.667 回答