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.
to pokazuje, ile zasysa. to niewiarygodne, ile kółek musisz przeskoczyć, aby wypracować tak prostą rzecz, – jere
@jak się zgodziłeś, to rozczarowuje. –
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