Можете ли вы использовать необязательные параметры в методе службы WCF?

Я видел сообщения типа this и , но каждому из них несколько лет.

Могу ли я сделать что-то вроде этого?

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

Ответ 1

Вы не можете. Существует много ограничений на WCF в отношении сигнатур метода; некоторые ограничения связаны с механизмом хоста, а другие - из-за WSDL/MEX.

Несмотря на то, что WCF потенциально может позволить вам иметь параметры по умолчанию в вашем служебном коде и перегруженные методы и многое другое, когда вы размещаете свою службу, она может или не запускаться, или она может запускаться, но может или не работать. Это сложно.

Что я сделал, чтобы преодолеть это, так это то, что я использую нулевые параметры везде, где это необходимо, а затем в моем клиентском коде всегда есть уровень сервиса, доступ к моему автогенерированному клиентскому прокси; мой сервисный уровень имеет все перегрузки и необязательные параметры, которые я хочу. Пример (грязный код):

Служба 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 );
}