1

サービスへのすべての呼び出しは、個人用チャネルを介して機能する必要があります。したがって、サーバー プロキシにアクセスできるすべてのメソッドは次のようになります。

public async Task<SDRLocation[]> FindLocationsAsync(string searchString)
    {
        ChannelFactory<IQueryService> channel = new ChannelFactory<IQueryService>("SomeServ_IQuery");
        channel.Open();
        SomeProxy = channel.CreateChannel();
        Location[] locationEntitiesFound = await SomeProxy.FindLocationsAsync(searchString);
        ((IChannel)SomeProxy ).Close();

        return locationEntitiesFound.Select(x => new SDRLocation(x)).ToArray();
    }

しかし、このサービス呼び出しのようなメソッドがたくさんあるので、コードの重複を避けて、このメソッド ラッパーを作成しようとしました。

public TResult HandleServiceCall<TResult>(Func<IPlantOrgQueryService, TResult> serviceMethod)
    {
        ChannelFactory<IQueryService> channel = new ChannelFactory<IQueryService>("SomeServ_IQuery");
        channel.Open();
        IQueryService newProxy = channel.CreateChannel();
        TResult results = serviceMethod(newProxy);
        ((IChannel)newProxy).Close();

         return results;
    }

今、私はどこでも次のような呼び出しを行うことを期待しています:

public async Task<SDRLocation[]> FindLocationsAsync(string searchString)
    {
        Location[] locationEntitiesFound = await HandleServiceCall(x => x.FindLocationsAsync(searchString));

        return locationEntitiesFound.Select(x => new SDRLocation(x)).ToArray();
    }

しかし、「通信オブジェクト System.ServiceModel.Channels.ClientReliableDuplexSessionChannel は、中止されたため、通信に使用できません」というエラーが表示されます。

HandleServiceCall のないメソッドは問題なく機能するため、何が問題なのかわかりません...

助けてください

4

1 に答える 1

1

のタイプは、TResult何が問題なのかを知らせます。ですTask<Location[]>Closeしたがって、非同期呼び出しが完了する前に(を介して)プロキシを破棄します。

修正は、元のコードが行っているのと同じように、await呼び出すTask前に行われます。Closeこれでうまくいくはずです:

public async Task<TResult> HandleServiceCall<TResult>(Func<IPlantOrgQueryService, Task<TResult>> serviceMethod)
{
    ChannelFactory<IQueryService> channel = new ChannelFactory<IQueryService>("SomeServ_IQuery");
    channel.Open();
    IQueryService newProxy = channel.CreateChannel();
    TResult results = await serviceMethod(newProxy);
    ((IChannel)newProxy).Close();

     return results;
}
于 2013-02-18T23:54:04.257 に答える