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的状态行,则它处于已创建状态。但是,当尝试获取响应时,它将进入故障状态。
请问有人可以帮我吗?我尝试了堆栈中提到的一些方法,但没有找到解决方案。
问题是使用...
简单的解决方案:
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)