1

以下のようなエラーが表示されます

「通信オブジェクト System.ServiceModel.Channels.ServiceChannel は、Faulted 状態のため、通信に使用できません。」

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();
}

上記のコードでは、リクエストを送信できますが、レスポンス行に来てレスポンスを取得しようとすると、障害状態に移行し、上記のエラーが発生します.レスポンスに移行する前に、SecurityClientの状態を確認しました.行、それは作成された状態にあります.しかし、応答を取得しようとすると、障害状態に移行します.

スタックに記載されている方法のいくつかを試しましたが、解決策が見つかりませんでした。

4

1 に答える 1

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();

よりエレガントなソリューション:

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;
            }          
        }
    }
}

次に、次の構文を使用してインスタンス化します。

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

Using ステートメントに関する問題の回避

于 2012-05-17T20:26:57.453 に答える