WCF и необязательные параметры

Я только начал использовать WCF с REST и UriTemplates. Можно ли использовать дополнительные параметры?

Если нет, что бы вы, ребята, рекомендовали мне для системы, которая имеет три параметра, которые всегда используются в URL-адресе, а другие, которые являются необязательными (переменная сумма)?

Пример:

https://example.com/?id=ID&type=GameID&language=LanguageCode&mode=free 
  • id, тип, язык всегда присутствуют
  • не является обязательным.

Ответ 1

Я просто тестировал его с WCF 4, и он работал без проблем. Если я не использую режим в строке запроса, я получу значение null в качестве значения параметра:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebGet(UriTemplate = "GetData?data={value}&mode={mode}")]
    string GetData(string value, string mode);
}

Реализация метода:

public class Service : IService
{
    public string GetData(string value, string mode)
    {
        return "Hello World " + value + " " + mode ?? "";
    }
}

Для меня это похоже на то, что все параметры строки запроса являются необязательными. Если параметр не присутствует в строке запроса, он будет иметь значение по умолчанию для своего типа = > null для string, 0 для int и т.д. MS также заявляет, что это должно быть реализовано.

В любом случае вы всегда можете определить UriTemplate с помощью id, type и language и получить доступ к необязательным параметрам внутри метода WebOperationContext:

var mode = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["mode"];

Ответ 2

Я попытался с дополнительными параметрами в спокойной веб-службе, Если мы ничего не передаем в значении параметра, оно остается равным нулю. После этого мы можем проверить нулевой или пустой функции. Если это null, то не используйте его, иначе вы можете его использовать. Скажем, у меня ниже кода

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebGet(UriTemplate = "GetSample?part1={part1}&part2={part2}")]
    string GetSample(string part1, string part2);
}

Здесь part1 является обязательным, а part2 является необязательным. Теперь функция будет выглядеть как

public class Service : IService
{
    public string GetSample(string part1, string part2)
    {
        if (!string.IsNullOrEmpty(part2))
        {
            return "Hello friends..." + part1 + "-" + part2;
        }
        return "Hello friends..." + part1;
    }
}

Вы также можете сделать преобразование в соответствии с вашими требованиями.

Ответ 3

Вы должны использовать "?" затем "/" в вашем URL.

Пример:

[WebGet(UriTemplate = "GetSample/?OptionalParamter={value}")]
    string GetSample(string part1);