web-dev-qa-db-fra.com

Pouvez-vous utiliser des paramètres facultatifs dans une méthode de service WCF?

J'ai vu des messages comme this et this mais ils ont chacun quelques années.

Puis-je faire quelque chose comme ça?

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

Tu ne peux pas. Il existe de nombreuses restrictions sur WCF concernant les signatures de méthode; certaines restrictions sont dues au mécanisme Host, et d'autres à cause du WSDL/MEX.

Malgré le fait que WCF pourrait potentiellement vous laisser des paramètres par défaut dans votre code de service et des méthodes surchargées et bien d'autres choses, lorsque vous hébergez votre service, il peut ou non démarrer, ou il peut démarrer mais peut ou non fonctionner. C'est compliqué.

Ce que j'ai fait pour surmonter cela, c'est que j'utilise des paramètres nullables partout où cela est nécessaire, puis sur mon code client, j'ai toujours une couche de service qui accède à mon proxy client généré automatiquement; ma couche de service a toutes les surcharges et les paramètres facultatifs que je veux. Exemple (code sale):

service WCF:

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

Client Service Layer (pas le proxy généré automatiquement, mais celui que j'ai écrit)

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

Mon application client utilise la couche de service client

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