2009-11-10 16 views
7

वेब डब्ल्यूटीपी सेवा का उपयोग करने वाली डब्ल्यूसीएफ सेवा स्थापित करने के डब्ल्यूसीएफ रेस्ट पैरामीटर ... मैं XML से ठीक प्रकार के तरीके से जटिल प्रकार वापस कर सकता हूं। मैं एक जटिल प्रकार को पैरामीटर के रूप में कैसे ले सकता हूं?जटिल प्रकार

[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 केवल तारों की अनुमति देता है, तो सबसे अच्छा अभ्यास क्या है? विचार यह है कि क्लाइंट ऐप किसी व्यक्ति के लिए खोज मानदंड जैसी सेवा के लिए अनुरोध पोस्ट करेगा। सेवा एक्सएमएल के रूप में डेटा युक्त उचित वस्तु के साथ प्रतिक्रिया देगी।

उत्तर

8

आप बाकी का उपयोग कर जटिल प्रकार पोस्ट कर सकते हैं।

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

कार्यान्वयन इस तरह दिखता है:

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

आप एक 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); 
} 

या आप के रूप में अच्छी तरह से एक HttpWebRequest के साथ कॉल कर सकते हैं, लेखन एक जटिल बाइट सरणी के लिए जटिल प्रकार जो हम मोबाइल क्लाइंट से करते हैं।

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

आपके दोनों लिंक आपके पोस्ट में तोड़ दिए गए हैं, इसलिए मुझे यकीन नहीं है कि मैं पूरी तरह बता सकता हूं कि आप क्या कर रहे हैं। क्या आप कह रहे हैं कि आप आरईएसटी का उपयोग कर जटिल प्रकार पोस्ट नहीं कर सकते? –

+1

आराम का उपयोग कर जटिल प्रकार कैसे पोस्ट किया जाता है? बूल DeleteCustomerOrder विधि में, जब पोस्ट सबमिट किया जाता है तो सेवा को ग्राहकसॉर्टर ऑर्डर ऑब्जेक्ट में कैसे पास किया जाता है? – Excelsior

0

आपके विकल्प:

  1. उपयोग पोस्ट और मनमाने ढंग से जटिलता के एक XML दस्तावेज़ स्वीकार करते हैं, या
  2. उपयोग मिलता है और एक तरह से आपकी क्वेरी कसौटी को एक ऐसे URL पथ मैप करने के लिए आंकड़ा।

मैं पूर्व की सिफारिश करता हूं, यह अधिक विश्वसनीय और कम हैकी लगता है। POST एक प्रश्न सबमिट करना होगा, और जवाब में आपको एक क्वेरी मिल जाएगी आईडी, जो आपने सबमिट किया है उससे संबंधित कुछ।

आरईएसटी विचारों के मुताबिक, आप क्वेरी के परिणाम प्राप्त करने के लिए उस आईडी पर पहुंचने के लिए कर सकते हैं।

0

आप आरएसटी सेवा कॉल में इनपुट बॉडी के रूप में एक JSON स्ट्रिंग या एक्सएमएल प्रारूप डेटा पास कर सकते हैं और सेवा अनुबंध परिभाषा में इसका उल्लेख कर सकते हैं। फिर यह आपको आरईएसटी सेवा कॉल में इनपुट के रूप में ऑब्जेक्ट पास करने की अनुमति देगा।

संबंधित मुद्दे