Именованные и необязательные параметры, а также WCF

поэтому .Net 4 добавил именованные и необязательные параметры, которые довольно приятны. Мне не нужно делать столько методов перегрузки 1 строки.

Будет ли это работать через WCF?


person puffpio    schedule 15.04.2010    source источник


Ответы (3)


Поскольку это семантика компилятора, я бы сказал нет. Однако вы ожидаете, что они будут работать только следующим образом.

На стороне сервисного кода весь код будет принимать параметры по умолчанию.

На стороне клиента я отмечаю, что инструмент «Добавить ссылку на службу» в VS2010 не берет значения по умолчанию и не добавляет их к сгенерированному прокси. Так что вам придется создать свой собственный прокси.

Таким образом, клиентский код может использовать значения по умолчанию, если значение по умолчанию указано в реализации контракта на стороне клиента.

Я бы сказал, что то же самое верно и для именованных параметров.

В целом да, но этот материал не переносится через WCF. Все, что произойдет, это то, что прокси-сервер клиента должен будет отправить в фабрику каналов в качестве правильного параметра.

person Preet Sangha    schedule 16.04.2010
comment
Основной причиной этого является то, что ни WSDL, ни MEX ничего не знают о возможностях языка программирования C#. У них нет способа описать необязательные параметры. - person John Saunders; 13.11.2012

WSDL не может описывать необязательные параметры, поэтому ответ «нет».

person John Saunders    schedule 16.04.2010
comment
К сожалению, [OperationContract] просто молча преобразует необязательные параметры в обязательные :( - person epalm; 05.12.2011
comment
@epalm: ничего не конвертирует. Он просто игнорирует то, что не имеет отношения к делу. - person John Saunders; 05.12.2011
comment
Уточнение: когда я размещаю службу WCF и создаю прокси-сервер через обмен метаданными, методы в сгенерированном Reference.cs имеют обязательные параметры, хотя методы в службе содержат необязательные параметры. - person epalm; 05.12.2011
comment
@epalm: это по причине, которую я указал в своем ответе: WSDL и MEX ничего не знают ни о необязательных параметрах, ни о каких-либо других функциях, специфичных для платформы. Посмотрите, например, что они не поддерживают async. - person John Saunders; 05.12.2011

Я работаю с VS 2017, .Net 4 и проектом WcfService. У меня есть такая служба:

Интерфейс:

namespace MyServiceNamespace
{
[ServiceContract]
public interface IMyService
{
  [OperationContract]
  [WebGet(ResponseFormat = WebMessageFormat.Json)]
  String GetSomething(int Produkt, DateTime MyDate, char SomeFlag);
}

public class myService : IMyService
{
  public String GetSomething(int Produkt, DateTime MyDate, char SomeFlag)
  {
    if(Produkt==0){Produkt=12345;}
    if(MyDate==DateTime.MinValue){MyDate=DateTime.Today;}
    if(SomeFlag=='\0'){SomeFlag='F';}
    return dosomething();
  }

}
}

я могу вызвать это с помощью http://myserver/myservice.svc/GetSomething?Produkt=1&MyDate=2018-01-01&SomeFlag=A

но также http://myserver/myService.svc/GetSomething?Produkt=1&MyDate=2018-01-01

или даже http://myserver/myservice.svc/GetSomething

отсутствующие параметры заполняются «пустым» или значением по умолчанию типа. Я не знаю, есть ли лучший способ установить собственное значение по умолчанию, потому что

public String GetSomething(int Produkt, DateTime MyDate, char SomeFlag='F')

не сработало, все равно SomeFlag =='\0'

Чего я не узнал, так это того, как я могу определить, есть ли значение, потому что параметр отсутствовал или был вызван, например, 1.1.0001.

Обновление: разметка MyService.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="MyServiceNameSpace.MyService" CodeBehind="MyService.svc.cs" Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory  %>
person SEn sen    schedule 29.06.2018