2009-11-10 23 views
7

WebHttpBinding kullanan bir WCF hizmeti ayarlama ... Yöntemden karmaşık türleri XML tamam olarak döndürebilirim. Karmaşık bir tipte parametre olarak nasıl alabilirim?WCF Karmaşık türlerini içeren dinlenme parametreleri

[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); 
} 

UriTemplate yalnızca dizelere izin verdiğinden, en iyi uygulama nedir? Fikir, müşteri uygulamasının bir kişiye yönelik arama kriterleri gibi bir hizmete istek göndermesidir. Hizmet, verileri XML olarak içeren uygun nesne ile yanıt verecektir.

cevap

8

Kalanları kullanarak karmaşık türleri gönderebilirsiniz.

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

uygulama şuna benzer:

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

Bir WPF istemciden bir yöntemi çağırabilirsiniz:

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); 
} 

Yoksa yazma yanı HttpWebRequest bir ile diyebilirsin Bir mobil istemciden yaptığımız bir bayt dizisine karmaşık bir tür.

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

Her iki bağlantınız da yayınınızda kırıldı, bu yüzden yaptığınızı tam olarak anlayabildiğimden emin değilim. REST kullanarak karmaşık tipler gönderemeyeceğinizi mi söylüyorsunuz? –

+1

Karmaşık türü Rest kullanılarak nasıl kaydedilir? Bool DeleteCustomerOrder yönteminde, posta gönderildiğinde, hizmet CustomerSpecialOrder nesnesini nasıl iletir? – Excelsior

0

Seçenekleriniz:

  1. kullanım POST ve keyfi karmaşıklığın bir XML dokümanı kabul etmek veya
  2. kullanım GET ve sorgu kriterine bir URL yolu eşleştirmek için bir yolunu.

Eskiyi tavsiye ederim, daha iyi hissettiriyor ve daha az hacky. POST, bir sorgu göndermek ve yanıt olarak, gönderdiğiniz öğeyle ilgili bir sorguya sahip olmanızdır.

REST fikirlerine göre, sorgunun sonuçlarını almak için o kimliğe bürünebilirsiniz.

0

Bir JSON dizesi veya XML biçim verisini REST servis çağrısında giriş gövdesi olarak geçirebilir ve servis sözleşmesi tanımında aynı şekilde söz edebilirsiniz. Ardından REST servis çağrısında bir nesneyi giriş olarak iletmenize izin verir.