6

私が知る限り、デフォルトの WCF 構成オプションを使用して、WCF を使用して SQL Server 2008 SSRS Web サービス ( .../reportserver/ReportService2005.asmx?wsdl) をサブスクライブしています。

ただし、ローカル プロキシ クラスを生成するときに奇妙なことを行います。

例として ListChildren メソッドを使用します。

クライアント側では、予想どおり、WCF は次のようなインターフェイスを生成します。

public interface ReportingService2005Soap {

    ListChildrenResponse ListChildren(ListChildrenRequest request);

}

また、そのインターフェースを実装する「クライアント」プロキシも生成します。

public partial class ReportingService2005SoapClient :
    System.ServiceModel.ClientBase<ReportingService2005Soap>, ReportingService2005Soap 
{

    [EditorBrowsableAttribute(EditorBrowsableState.Advanced)]
    ListChildrenResponse ReportingService2005Soap.ListChildren(ListChildrenRequest request) 
    {
        return base.Channel.ListChildren(request);
    }

    public ServerInfoHeader ListChildren(string Item, bool Recursive, out CatalogItem[] CatalogItems) {
        ListChildrenRequest inValue = new ListChildrenRequest();
        inValue.Item = Item;
        inValue.Recursive = Recursive;
        ListChildrenResponse retVal = ((ReportingService2005Soap)(this)).ListChildren(inValue);
        CatalogItems = retVal.CatalogItems;
        return retVal.ServerInfoHeader;
    }

}

ご覧のとおり、クライアント プロキシはインターフェイスを実装し、インターフェイスを明示的に実装することによって (インターフェイス メソッドにアクセスするにはキャストする必要があります)、さらに EditorBrowsableState.Advanced 属性を使用して、使用されないように「非表示」にします。

次に、「out」パラメーターを使用する追加のラッパー メソッドを追加します。

それをやめて、インターフェイスを直接実装する方法はありますか?

ここで行っていることは、'out' パラメーターを指定してラッパー メソッドを使用する方法へと導きます。その後、ラッパー メソッドは仮想ではなく、どのインターフェイスでも定義されていないため、サービスを簡単にモックできないことがわかります。 .

注意: ここでは例として SSRS Web サービスを使用していますが、WCF が他のサービスでもこれを行うのを見てきました。

4

1 に答える 1

7

これは、サービスがMessageContracts を使用している場合に発生する可能性があります。プロキシの作成では、デフォルトでこれらのメッセージ コントラクトをアンラップして、公開された操作がコンテンツを直接受け入れるようにします。クライアントでもメッセージ コントラクトを使用する場合は、[サービス参照の追加]の詳細設定で [常にメッセージ コントラクトを生成する]をオンにして構成する必要があります。

于 2011-08-26T13:55:58.153 に答える