WCF 4: передача пустых параметров по запросу GET - PullRequest
0 голосов
/ 25 января 2011

Я создаю API, который будет просто использовать запрос get для возврата некоторых результатов поиска из базы данных, я пытаюсь сделать так, чтобы можно было передавать необязательные параметры (легко с WCF), но также и, если параметрыуказываются в строке запроса, пока они пусты, они будут игнорироваться службой.

Однако, если у вас есть строка запроса с пустыми параметрами, она вернет неверный запрос (400) сервером, например,

Используя выбранную вами точку конечного пользователя, передайте следующую строку запроса

http://www.exampleservice.com/basic/?apiKey=1234&noOfResults=3&maxSalary=&minSalary=&ouId=0&keywords=Web+Developer

Обратите внимание, что maxSalary и minSalary не передают значения

Затем у вас есть следующая служба WCF:

[OperationContract]
[WebGet(UriTemplate = "basic/?apiKey={apiKey}&noOfResults={noOfResults}&maxSalary={maxSalary}&minSalary={minSalary}&ouId={ouId}&keywords={keywords}", BodyStyle = WebMessageBodyStyle.Bare)]
        public List<SearchResultsDto> BasicSearch(string keywords, string apiKey, int noOfResults, int maxSalary, int minSalary, int ouId)
    {
          //Do some service stuff
    }

Это приведет кОшибка 400, может кто-нибудь объяснить, как вы передаете пустые параметры службе WCF или это просто невозможно?

Ответы [ 4 ]

2 голосов
/ 03 февраля 2011

В настоящее время передача пустого или пустого параметра не поддерживается в WCF. Основное решение этой проблемы - переопределение querystringconverter, который обрабатывает URL-адрес, когда он проходит через канал, но до того, как он достигнет контракта на работу.

Отличный пример реализации расширения конвертора querystring находится здесь:

В модели веб-программирования WCF, как можно написать контракт операции с массивом параметров строки запроса (то есть с тем же именем)?

ОДНАКО К сожалению, в WCF 4 есть ошибка, из-за которой вы не можете переопределить преобразователь querystring, она была устранена Microsoft и будет исправлена ​​в выпуске SP1, который выйдет в этом году.

До тех пор не существует чистого способа справиться с этой ситуацией, кроме как обработать исключение и вернуть код состояния 400 (неправильный запрос) - хорошая документация API должна справиться с этим в промежуточный период.

0 голосов
/ 25 января 2011

Вы можете отправить «-1» и рассматривать это в своей бизнес-логике как не отправленное.

0 голосов
/ 26 января 2011

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

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

[ServiceContract]
public interface IService1    
{
    [OperationContract]
    [WebGet(RequestFormat=WebMessageFormat.Json)]
    RequestObject BasicSearch(RequestObject apiKey);
}

public class Service1 : IService1
{
    public RequestObject BasicSearch(RequestObject obj)
    {
        //Do some service stuff

        return obj;
    }
}

[DataContract]
public class RequestObject
{      

    [DataMember]
    public string Keywords {get; set;}

    [DataMember]
    public string ApiKey {get; set;}

    [DataMember]
    public int NoOfResults { get; set; }

}

Преимущества (буду коротким, перезвоните за подробностями)

  • Без изменений в контракте на обслуживание подпись не меняется

  • вы получите гибкость с нулевыми параметрами

  • вы всегда можете расширить количество параметров без какого-либо влияния на существующие услуги

ниже приведен пример ввода и вывода из fiddler Примечание: в части запроса я не передал что-либо NumberOfResults намеренно, чтобы доказать Fiddler screen shot with sample request and response

0 голосов
/ 25 января 2011

Это целые числа доставляют вам неприятности?Может быть, вы можете попробовать сделать их обнуляемыми?

int?MaxSalary

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...