web-dev-qa-db-ja.com

WCFサービスメソッドでオプションのパラメーターを使用できますか?

thisthis のような投稿を見てきましたが、それぞれ数年前のものです。

このようなことはできますか?

    [OperationContract]
    [FaultContract(typeof(MyCustomFault))]
    List<InventoryPart> SelectMany(string partialPartNumber, string division = null);
19
BBauer42

できません。メソッドシグネチャに関してWCFには多くの制限があります。一部の制限はホストメカニズムによるものであり、他の制限はWSDL/MEXによるものです。

WCFを使用すると、サービスコードやオーバーロードされたメソッドなどの多くの既定のパラメーターを使用できる可能性があるという事実にもかかわらず、サービスをホストすると、サービスが開始する場合と開始しない場合、または開始しても機能しない場合があります。トリッキーです。

これを克服するために私が行ったのは、必要に応じてnull許容パラメーターを使用することです。そのため、クライアントコードでは、自動生成されたクライアントプロキシにアクセスするサービスレイヤーが常にあります。私のサービス層には、必要なすべてのオーバーロードとオプションのパラメーターがあります。例(ダーティコード):

WCFサービス:

[OperationContract]
[FaultContract(typeof(MyCustomFault))]
List<InventoryPart> SelectMany(string partialPartNumber, string division, int? subDivision, bool? isActive);

クライアントサービスレイヤー(自動生成されたプロキシではなく、私が作成したプロキシ)

public List<InventoryPart> GetParts(string partialPartNumber){
    return GetParts(partialPartNumber, null);
}

public List<InventoryPart> GetParts(string partialPartNumber, string division){
    return GetParts(partialPartNumber, division, null);
}

public List<InventoryPart> GetParts(string partialPartNumber, string division, int? subDivision){
    return GetParts(partialPartNumber, division, subDivision, null);
}

public List<InventoryPart> GetParts(string partialPartNumber, string division, int? subDivision, bool? isActive){
    // This method is the one that actually calls the client proxy channels and all.
}

クライアントアプリはクライアントサービスレイヤーを使用します

public void LoadPartNumbers(){
    var parts = ClientServiceLayer.GetParts(this.txtPartNumber.Text, null, (int) this.cboDivisions.SelectedItem );
}
33
DanielCuadra