2011-01-25 3 views
0

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

Однако, если у вас есть строка запроса с пустыми параметрами, она возвращает неверный запрос (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, пожалуйста, кто-нибудь может объяснить, как вы передаете пустые параметры в WC F или это просто невозможно?

ответ

2

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

Отличным примером implmenting о продлении querystringconverter находится здесь:

In the WCF web programming model, how can one write an operation contract with an array of query string parameters (i.e. with the same name)?

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

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

0

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

int? MaxSalary

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

+0

Типы с нулевым значением не поддерживаются в ящике с WCF 4, и в настоящее время перегрузочный преобразователь не может быть перегружен. - Хороший ответ, хотя с SP1 WCF 4 это сработало бы – Jay

+0

Ah thanx для этого, каждый день это schoolday ;-). В ответ на ваш другой вопрос: конвертер querystring - единственный крючок в конвейере, который вы должны изменить? Не удастся ли удалить пустые параметры в событии OnBeginRequest или что-то еще? – Syg

0

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

+0

это плохая практика, поскольку она включает в себя передачу ложной информации для представления другого действия, то есть что-то ничего не значит. например что, если в будущем вы захотите пройти -1, это будет полностью пропущено. – Jay

0

Его можно обрабатывать несколькими способами. Поскольку вы говорите о службе 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; } 

} 

Преимущество (Собирается быть короткими, свистеть меня для деталей)

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

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

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

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

Смежные вопросы