2012-05-10 25 views
7

Mam problemy z pobieraniem prostych usług za pomocą WCF. Wszystko poszło dobrze do tej pory, z wyjątkiem sytuacji, gdy przychodzi do implementacji opcjonalnych parametrów ciągu zapytania. Interfejs wygląda trochę tak:Zużywanie usługi REST za pomocą WCF - opcjonalne parametry zapytania kwerendy?

[ServiceContract] 
[XmlSerializerFormat] 
public interface IApi 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "/url/{param}?top={top}&first={first}")] 
    object GetStuff(string param, int top, DateTime first); 
} 

to jest spożywane przez utworzenie klasy, która dziedziczy ClientBase<IApi>. Próbowałem kilka sposobów, aby parametry opcjonalne:

1) Sprawdź parametry pustych

To nie działa. Dostaję wiadomość z QueryStringConverter jak inna kwestia poprosił: Can a WCF service contract have a nullable input parameter?

2) jeden parametr na końcu adresu URL

So, myślałem o zmianie UriTemplate się być bardziej uniwersalne, budowania zapytania ciąg i przekazywanie go jako parametru. To też nie działa, ponieważ przekazywana wartość zostaje zakodowana tak, że serwer nie rozpoznaje jej jako zapytania.

Przykład:

[WebGet(UriTemplate = "/url/{query}")] 

3) hackish Rozwiązanie

Jedynym sposobem znalazłem tak daleko od coraz to do pracy jest zmiana wszystkich parametrów do strun, a NULL wydają się być dozwolone tutaj.

przykład:

[WebGet(UriTemplate = "/url/{param}?top={top}&first={first}")] 
object GetStuff(string param, string top, string first); 

zużycie tego interfejsu wciąż przyjmuje właściwy rodzaj zmienny, ale ToString używany. Parametry ciągu zapytania Thes nadal pojawiają się w rzeczywistym żądaniu.

Czy istnieje sposób, gdy zużywa usługi REST za pomocą WCF, aby parametry ciąg kwerendy opcjonalne?

AKTUALIZACJA - Jak zostało to naprawione

radą, aby utworzyć zachowanie usługa została podjęta. To dziedziczy po WebHttpBehaviour. Wygląda to następująco:

public class Api : ClientBase<IApi> 
{ 
    public Api() : base("Binding") 
    { 
     Endpoint.Behaviors.Add(new NullableWebHttpBehavior()); 
    } 
} 

NullableWebHttpBehavior można znaleźć pod następującym pytaniu Stackoverflow: Can a WCF service contract have a nullable input parameter?. Jedynym problemem było to, ConvertValueToString nie został przeciążony, więc bitą szybki jedną up:

public override string ConvertValueToString(object parameter, Type parameterType) 
    { 
     var underlyingType = Nullable.GetUnderlyingType(parameterType); 

     // Handle nullable types 
     if (underlyingType != null) 
     { 
      var asString = parameter.ToString(); 

      if (string.IsNullOrEmpty(asString)) 
      { 
       return null; 
      } 

      return base.ConvertValueToString(parameter, underlyingType); 
     } 

     return base.ConvertValueToString(parameter, parameterType); 
    } 

To nie może być doskonały, ale wydaje się, aby działać zgodnie z przeznaczeniem.

+1

to pokazuje, ile zasysa. to niewiarygodne, ile kółek musisz przeskoczyć, aby wypracować tak prostą rzecz, – jere

+0

@jak się zgodziłeś, to rozczarowuje. –

+0

Uzgodniono, że wcf jest zbyt skomplikowany do tworzenia aplikacji w stylu odpoczynku. Problem, który próbuje rozwiązać wcf, sprawia, że ​​usługi są dostępne dla różnych protokołów (tcp, msmq i http), a reszta jest z natury powiązana z http. Można więc twierdzić, że wcf jest złym wyborem do realizacji usług wypoczynkowych. – faester

Odpowiedz

1

opcję 1) może pracować dla klienta WCF, ponieważ WebHttpBehavior mogą być stosowane do ClientBase (lub ChannelFactory) klasy pochodnej, jak pokazano w tym SO question & answer. Wystarczy połączyć kod odwołać w 1) o konfiguracji pokazanej w przechwytywania 500 odpowiedzi na pytanie i pokazuje pracę.

+0

Dzięki. Dodałem szczegóły implementacji do mojej odpowiedzi. – Mig

0

Czy próbowałeś używać typów nullable?

object GetStuff(string param, int? top, DateTime? first); 
Powiązane problemy