通信对象System.ServiceModel.Channels.ServiceChannel无法用于通信,因为它处于故障状态

Aru*_*mar 1 .net c# wcf c#-4.0

我收到以下错误

“通讯对象System.ServiceModel.Channels.ServiceChannel无法用于通讯,因为它处于故障状态。”

using (SecurityClient securityClient = new SecurityClient())
{                        
    SecurityService.GetIncomingPermissionsByIdRequest securityRequest =
        new GetIncomingPermissionsByIdRequest(Convert.ToInt32(recordId));
    SecurityService.GetIncomingPermissionsByIdResponse securityResponse =
        securityClient.GetIncomingPermissionsById(securityRequest);
    incomingPermissions = securityResponse.GetIncomingPermissionsByIdResult;
    SetPermissionFields();
    SetPermissionList();                  
    securityClient.Close();
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我能够发送请求,但是当涉及到响应行并尝试获取响应时,它会移至错误状态并遇到上述错误。在移至响应之前,我已经检查了SecurityClient的状态行,则它处于已创建状态。但是,当尝试获取响应时,它将进入故障状态。

请问有人可以帮我吗?我尝试了堆栈中提到的一些方法,但没有找到解决方案。

Bob*_*obK 5

问题是使用...

简单的解决方案:

SecurityClient securityClient = new SecurityClient();

SecurityService.GetIncomingPermissionsByIdRequest securityRequest = new GetIncomingPermissionsByIdRequest(Convert.ToInt32(recordId));
SecurityService.GetIncomingPermissionsByIdResponse securityResponse = securityClient.GetIncomingPermissionsById(securityRequest);
incomingPermissions = securityResponse.GetIncomingPermissionsByIdResult;
SetPermissionFields();
SetPermissionList();                  
securityClient.Close();
securityClient.Dispose();
Run Code Online (Sandbox Code Playgroud)

一个更优雅的解决方案:

创建一个WCF扩展:

using System;
using System.ServiceModel;

namespace MyNamespace
{
    public static class WcfExtensions
    {
        public static void Using<T>(this T client, Action<T> work)
            where T : ICommunicationObject
        {
            try
            {
                work(client);
                client.Close();
            }
            catch (CommunicationException e)
            {
                client.Abort();
            }
            catch (TimeoutException e)
            {
                client.Abort();
            }
            catch (Exception e)
            {
                client.Abort();
                throw;
            }          
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用以下语法实例化:

    new SecurityClient().Using(securityClient => 
        {
            SecurityService.GetIncomingPermissionsByIdRequest securityRequest = new GetIncomingPermissionsByIdRequest(Convert.ToInt32(recordId));
            SecurityService.GetIncomingPermissionsByIdResponse securityResponse = securityClient.GetIncomingPermissionsById(securityRequest);
            incomingPermissions = securityResponse.GetIncomingPermissionsByIdResult;
            SetPermissionFields();
            SetPermissionList();                  
        });
Run Code Online (Sandbox Code Playgroud)

避免using语句出现问题