2009-11-10 17 views
7

Konfigurowanie usługi WCF korzystającej z usługi webHttpBinding ... Mogę zwrócić złożone typy z metody jako XML ok. Jak wziąć typ złożony jako parametr?Parametry spoczynkowe WCF dotyczące typów złożonych

[ServiceContract(Name = "TestService", Namespace = "http://www.test.com/2009/11")] 
public interface ITestService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", 
       BodyStyle = WebMessageBodyStyle.Bare, 
       UriTemplate = "/Person/{customerAccountNumber}, {userName}, {password}, {PersonCriteria}")] 
    Person SubmitPersonCriteria(string customerAccountNumber, 
           string userName, 
           string password, 
           PersonCriteria details); 
} 

Ponieważ UriTemplate dopuszcza tylko łańcuchy, jaka jest najlepsza praktyka? Pomysł polega na tym, że aplikacja kliencka wysyła żądanie do usługi, takie jak kryteria wyszukiwania dla danej osoby. Usługa odpowie odpowiednim obiektem zawierającym dane jako XML.

Odpowiedz

8

Możesz pisać złożone typy używając odpoczynku.

[ServiceContract] 
public interface ICustomerSpecialOrderService 
{  
    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "deletecso/")] 
    bool DeleteCustomerOrder(CustomerSpecialOrder orderToDelete); 
} 

Realizacja wygląda następująco:

public bool DeleteCustomerOrder(CustomerSpecialOrder orderToDelete) 
{ 
    // Do something to delete the order here. 
} 

można wywołać metodę z klientem WPF:

public void DeleteMyOrder(CustomerSpecialOrder toDelete) 
{ 
    Uri address = new Uri(your_uri_here); 
    var factory = new WebChannelFactory<ICustomerSpecialOrderService>(address); 
    var webHttpBinding = factory.Endpoint.Binding as WebHttpBinding; 
    ICustomerSpecialOrderService service = factory.CreateChannel(); 
    service.DeleteCustomerOrder(toDelete); 
} 

Albo można nazwać to z HttpWebRequest, jak również, pisanie typ złożony do tablicy bajtów, którą wykonujemy z klienta mobilnego.

private HttpWebRequest DoInvokeRequest<T>(string uri, string method, T requestBody) 
{ 
    string destinationUrl = _baseUrl + uri; 
    var invokeRequest = WebRequest.Create(destinationUrl) as HttpWebRequest; 
    if (invokeRequest == null) 
     return null; 

    // method = "POST" for complex types 
    invokeRequest.Method = method; 
    invokeRequest.ContentType = "text/xml"; 

    byte[] requestBodyBytes = ToByteArray(requestBody); 
    invokeRequest.ContentLength = requestBodyBytes.Length; 


    using (Stream postStream = invokeRequest.GetRequestStream()) 
     postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length); 

    invokeRequest.Timeout = 60000; 

    return invokeRequest; 
} 
+0

http://blog.hackedbrain.com/archive/2007/10/05/6124.aspx -? – kd7

+0

Oba twoje linki są przerywane w twoim poście, więc nie jestem pewien, czy mogę całkowicie powiedzieć, co robisz. Czy mówisz, że nie możesz publikować złożonych typów przy użyciu usługi REST? –

+1

W jaki sposób typ złożony zostaje opublikowany przy użyciu Reszta? W metodzie Bool DeleteCustomerOrder, kiedy zostanie przesłany post, w jaki sposób usługa otrzyma obiekt CustomerSpecialOrder? – Excelsior

0

Twoje opcje:

  1. użycie POST i zaakceptować dokumentu XML arbitralnej złożoności lub
  2. użycie GET i rysunek sposób mapować ścieżkę URL do swojej kryterium kwerendy.

Polecam ten pierwszy, wydaje się bardziej relaksujący i mniej hackowy. POST powinien przesłać zapytanie, a w odpowiedzi dostaniesz queryId, coś związanego z tym, co przesłałeś.

Zgodnie z ideami REST można następnie uzyskać identyfikator, aby uzyskać wyniki zapytania.

0

Można przekazać ciąg znaków JSON lub dane w formacie XML jako treść wejściową w zaproszeniu serwisowym REST i wspomnieć o tym samym w definicji kontraktu serwisowego. Następnie pozwoli ci przekazać obiekt jako dane wejściowe w wywołaniu usługi REST.

Powiązane problemy