2009-09-29 12 views
10

मैं इसके साथ कुछ घंटे संघर्ष कर रहा हूं और संचार समस्या का हल नहीं ढूंढ पा रहा हूं। मेरी सेवा को एसओएपी या सादे एक्सएमएलडब्ल्यूसीएफ सेवा, एसओएपी या सादे एक्सएमएल में प्रतिक्रिया, कैसे?

के माध्यम से ग्राहकों के साथ संवाद करने की आवश्यकता है मेरी सेवा डब्ल्यूसीएफ ढांचे के आधार पर लिखी जाएगी, हालांकि मेरे ग्राहक नहीं।

क्या आप मुझे चरण-दर-चरण दिखा सकते हैं कि मेरा सेवा कोड और कॉन्फ़िगरेशन कैसे बदला जाए ताकि वह एसओएपी या एक्सएमएल संदेश वापस कर सके? मुझे दोनों समाधानों में दिलचस्पी है।

मैं इस जवाब पर इस आधारित प्राप्त करने के लिए कोशिश की है:

REST/SOAP endpoints for a WCF service Call WCF Using SOAP call

लेकिन इस समाधान में से कोई भी मेरे लिए ठीक से काम किया। या तो मुझे अपने ब्राउज़र या त्रुटि में कुछ भी नहीं मिला है कि संसाधन नहीं मिला।

इसलिए मैंने एक नई डब्ल्यूसीएफ सेवा परियोजना शुरू की है। यह http://localhost:3151/ के तहत चलाता है और इस तरह कोड है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace WcfService1 
{ 
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file. 
    public class Service1 : IService1 
    { 
     public string GetData(int value) 
     { 
      return string.Format("You entered: {0}", value); 
     } 

     public CompositeType GetDataUsingDataContract(CompositeType composite) 
     { 
      if (composite.BoolValue) 
      { 
       composite.StringValue += "Suffix"; 
      } 
      return composite; 
     } 
    } 
} 

शायद दो समाप्ति बिंदुओं बनाने की जरूरत I'will? उनमें से दोनों को बाध्यकारी पैरामीटर के रूप में basicHttpBinding होना चाहिए। लेकिन और क्या?

<CompositeType BoolValue = 0 StringValue = ""> 
इस से

बल्कि:

इसके अलावा, कैसे इस तरह एक एक्सएमएल (डेटा अनुबंध के आधार पर) का उत्पादन करने के

<CompositeType> 
    <BoolValue>0</BoolValue> 
    <StringValue></StringValue> 
</CompositeType> 

कृपया ध्यान दें कि मैं करने के लिए जरूरत है एक दो तरह से संचार के रूप में तो मेरी सेवा को एसओएपी या एक्सएमएल और एसओएपी या एक्सएमएल में प्रतिक्रिया प्राप्त करने की आवश्यकता है।

यदि यह संभव है तो भी मैं अपने ब्राउज़र में सेवा विधियों का विवरण देखना चाहूंगा जैसा कि यह एएसपी .NET में था।

अपने समय के लिए अग्रिम धन्यवाद।

बहुत बड़ा अद्यतन यहाँ नीचे

मैं कुछ समाधान खोजने के लिए कोशिश की है और यहाँ यह सब मैं अब तक क्या इकट्ठा है। मैंने केवल सादा एक्सएमएल पर ध्यान केंद्रित किया है।

एक ग्राहक से संदेश::

का कहना है कि प्रोटोकॉल इस तरह दिखता है की सुविधा देता है

<MESSAGE MessageParam1 = 0> 
    <AdditionalInfo>Some message info </AdditionalInfo> 
</MESSAGE> 

प्रतिक्रिया:

<RESPONSE ResponseParam1 = 0> 
    <AdditionalInfo>Some response info</AdditionalInfo> 
</MESSAGE> 

सबसे पहले, मैं वर्तमान का विवरण देखने के लिए करना चाहते हैं सेवा विधियों और यह सटीक स्वरूप में पैराम्स के रूप में उन्हें भेजा/प्राप्त किया जाएगा। क्या मेरा मतलब है कि जब मैं एएसपी .NET 2.0 WebServices जब मैं अपने ब्राउज़र में सेवा लागू के साथ प्रयोग किया गया था (बस सेवा शुरू की है) मैं ऐसे प्रतिक्रिया मिल गया है:

POST /Service1.asmx HTTP/1.1 
Host: localhost 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://tempuri.org/ShowUser" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <ShowUser xmlns="http://tempuri.org/"> 
     <MyLogin> 
     <User>string</User> 
     <Password>string</Password> 
     <Database>string</Database> 
     </MyLogin> 
    </ShowUser> 
    </soap:Body> 
</soap:Envelope> 

HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <ShowUserResponse xmlns="http://tempuri.org/"> 
     <ShowUserResult>string</ShowUserResult> 
    </ShowUserResponse> 
    </soap:Body> 
</soap:Envelope> 

और यह बहुत अच्छा है।इसके अलावा इसमें एसओएपी लिफाफा है (अंतर्निहित डेटा भी अलग है) लेकिन मुद्दा यह है कि मैं इसे क्लाइंट को दिखा सकता हूं और उसे बता सकता हूं: "आप इस तरह के एक्सएमएल संरचना के साथ HTTP पोस्ट विधि कर रहे हैं और आपको ऐसा उत्तर मिल रहा है"। मुझे डब्ल्यूसीएफ के साथ समान परिणाम चाहिए लेकिन यहां तक ​​कि सरल - SOAP के बिना। अब तक, जब मैं Service1.svc पर क्लिक करता हूं तो मुझे डब्लूएसडीएल कोड का एक गुच्छा मिल रहा है जिसे मैं नहीं चाहता हूं। मुझे पता है कि यह कुछ मामलों के लिए बहुत अच्छा है लेकिन मुझे नहीं पता कि मेरे क्लाइंट का उपयोग कौन सा मंच है। और यदि वह .NET का उपयोग नहीं करेगा, तो संभवतः वह डब्लूएसडीएल को सही तरीके से आयात नहीं करेगा।

तो आप जानते हैं कि मैं क्या प्राप्त करना चाहता हूं।

यह मैं अब तक दो लंबे दिनों के बाद क्या किया है ...:

namespace RESTService 
{ 
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config. 

    [ServiceContract] 
    [XmlSerializerFormat] 
    public interface IService 
    { 
     [OperationContract] 
     [WebGet] 
     Response EchoWithGet(string s); 

     [OperationContract] 
     [WebInvoke] 
     Response EchoWithPost(string s); 
    } 

    public class Response 
    { 
     [XmlAttribute] 
     public int ResponseParam1; 
     [XmlElement] 
     public string AdditionalInfo; 
    } 
} 

जैसा कि आप देख, क्योंकि मैं कैसे ब्राउज़र के माध्यम से विधि के लिए इसे पारित करने नहीं जानता कि मैं संदेश वर्ग प्रदान नहीं किया । मुझे केवल एक स्ट्रिंग को पास करने का तरीका पता है।

namespace RESTService 
{ 
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file. 
    public class Service1 : IService 
    { 
     public Response EchoWithGet(string s) 
     { 
      Response Transaction; 
      Transaction = new Response(); 
      Transaction.AdditionalInfo = "I've responded: " + s; 
      return Transaction; 
     } 
     public Response EchoWithPost(string s) 
     { 
      Response Transaction; 
      Transaction = new Response(); 
      Transaction.AdditionalInfo = "I've responded: " + s; 
      return Transaction; 
     } 
    } 
} 

config भी मेरे लिए रहस्य का एक सा है:

और यहाँ कार्यान्वयन और config है। मैंने बाध्यकारी बनाने की कोशिश की है क्योंकि इसे एमएसडीएन के विषयों में से एक में वर्णित किया गया है: http://msdn.microsoft.com/en-us/library/aa395208.aspx

लेकिन फिर एक विधि का आह्वान करने के बाद मैंने एक एसओएपी जैसी गलती संरचना वापस कर दी लेकिन एसओएपी लिफाफे के बिना।

<system.serviceModel> 
     <services> 
     <service name="RESTService.Service1"> 
      <host> 
      </host> 
      <endpoint 
       address="rest" behaviorConfiguration="webBehavior" 
       bindingConfiguration="" binding="webHttpBinding" 
       contract="RESTService.IService"/> 
     </service> 
     </services> 
     <behaviors> 
     <endpointBehaviors> 
      <behavior name="webBehavior"> 
       <webHttp /> 
      </behavior> 
     </endpointBehaviors> 
     </behaviors> 
</system.serviceModel> 

जब मैं इस तरह अपने ब्राउज़र में एक सेवा विधि आह्वान:

वैसे भी यहाँ

config है

http://localhost:2443/Service1.svc/rest/EchoWithGet?s=test

मैं एक XML फ़ाइल को अपने ब्राउज़र में मिल गया:

<Response ResponseParam1="0"> 
<AdditionalInfo>I've responded: test</AdditionalInfo> 
</Response> 

तो ऐसा लगता है कि मैं सही रास्ते पर हूं? हालांकि अभी भी मुझे नहीं पता कि क्या भेजा गया है और क्या प्राप्त हुआ है, इस बारे में पूरी जानकारी कैसे प्राप्त करें (जैसे एएसपी .NET 2.0 में से एक)। मैं HTTP के माध्यम से क्या चल रहा है यह देखने के लिए स्निफर के साथ सेवा बंदरगाह को नहीं सुनना चाहता हूं। मैं यह देखना चाहता हूँ।

<?xml version="1.0" encoding="utf-8"?><Response ResponseParam1="0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <br/> 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"><br/> 
<AdditionalInfo>I've responded: test</AdditionalInfo></Response> 

मैं वापस आ एक्सएमएल में यह अतिरिक्त जानकारी होगी नहीं करना चाहते, यह कैसे कटौती करने के लिए: इसके अलावा, जब मैं प्राप्त एक्सएमएल का स्रोत फ़ाइल को देखो मैं इस देखा है?

एक अन्य समस्या दूसरी विधि के साथ है:

http://localhost:2443/Service1.svc/rest/EchoWithPost?s=test

यह अपेक्षा के अनुरूप काम नहीं करता है। मुझे त्रुटि संदेश मिलता है कि "विधि की अनुमति नहीं है"। इसे कैसे हल करें?

तो, इस लंबे प्रश्न को पूरा करने दें।

मेरे पास कुछ आधा काम करने वाला समाधान है जो सही तरीका हो सकता है या गलत तरीका है। मैं आप से पूछना करने के लिए या तो इसे खत्म करने के लिए है कि यह भी कर सकते थे चाहते हैं:

  1. में विधि एक पैरामीटर के रूप एक XML फ़ाइल को स्वीकार करें।
  2. मुझे दिखाएं कि पैरामीटर के रूप में XML के साथ वेब ब्राउज़र में विधि को कैसे कॉल करें।हां, मैं .NET में एक अलग क्लाइंट नहीं चाहता हूं। ब्राउजर क्लाइंट बनने दें।
  3. मुझे दिखाएँ कैसे लौटे एक्सएमएल में अनावश्यक फूला हुआ जानकारी कटौती करने के लिए।
  4. मुझे दिखाओ कैसे मन है कि मैं सोप है नहीं करना चाहते पर असर के साथ नेट मेरी सेवा की 2.0 की तरह विवरण प्राप्त करने के लिए।
  5. मुझे के बारे में बताएं क्या EchoWithPost विधि के साथ गलत है। यह क्यों काम नहीं करता है?

यदि मेरा उदाहरण खराब है, तो कृपया मुझे कुछ बुनियादी उदाहरण प्रदान करें कि इसे कैसे प्राप्त किया जाना चाहिए।

मैं सिर्फ नेट और WCF सीख रहा हूँ और मैं बहुत उलझन में हूँ। सभी कि केवल सही डेटा विनिमय प्रोटोकॉल की स्थापना के साथ समस्याओं ... और मैं भी statred नहीं किया है एक वास्तविक सेवा लिखने के लिए: |

धन्यवाद आपके समय के लिए एक बहुत और भविष्य के किसी भी मदद करते हैं।

+0

@wozdu: आप पूरी तरह से सही रास्ते पर हैं; डब्ल्यूसीएफ आरईएसटी सेवाओं के साथ "सादा पुराना एक्सएमएल" पर उस स्क्रीनकास्ट को देखें - यह आपको वह सब कुछ करने की अनुमति देता है जो आप करना चाहते हैं (केवल तत्वों और विशेषताओं के साथ पूरी तरह से अनुकूलित एक्सएमएल लौटें)। –

उत्तर

6

आपके पास यहां सेवा है एक एसओएपी संदेश लौटाएगा - जिसमें "कंपोजिट टाइप" को "पेलोड" के रूप में शामिल किया जाएगा।

डिफ़ॉल्ट रूप से डब्ल्यूसीएफ एसओएपी का उपयोग करता है - मूलभूत एचटीपी बाइंडिंग, wsHttp बाइंडिंग, नेट टीसीपी बाइंडिंग इत्यादि। एसओएपी के साथ सभी काम उनके आधार के रूप में काम करते हैं।

यदि आप सीधे एक्सएमएल वापस करना चाहते हैं, तो आपको डब्ल्यूसीएफ की आरईएसटी क्षमताओं की जांच करनी होगी - यह webHttpBinding (और केवल बाध्यकारी) के साथ काम करता है।

<CompositeType BoolValue = 0 StringValue = ""> 
इस से

बल्कि:

इसके अलावा, कैसे इस तरह एक एक्सएमएल (डेटा अनुबंध के आधार पर) के उत्पादन के लिए

<CompositeType> 
    <BoolValue>0</BoolValue> 
    <StringValue></StringValue> 
</CompositeType> 

यह WCF DataContract serializer की एक सीमा है। प्रदर्शन कारणों से, यह विशेषताओं का समर्थन नहीं करता है, उदा। आप जो एक्सएमएल चाहते हैं उसका पहला टुकड़ा नहीं बना सकते हैं।

आप पूरी तरह पहली एक्सएमएल होना आवश्यक है, तो आप XmlSerializer बजाय (जो सीमाओं/समस्याओं के अपने स्वयं के सेट है) का उपयोग करना होगा।

मार्क

अद्यतन: अगर आप सिर्फ एक दिया एक्सएमएल वापस करना चाहते, तो आप शायद बाकी दृष्टिकोण के साथ बेहतर कर रहे हैं।

उत्कृष्ट series of screencasts on using REST के लिए प्लुरसाइट वेबसाइट देखें और विशेष रूप से, plain-old XML (POX) REST service बनाने के तरीके पर एक स्क्रीनकास्ट देखें।

+0

धन्यवाद marc_s लेकिन मैं XMLSerializer के साथ REST का उपयोग कैसे कर सकता हूं? आप कह रहे हैं कि इस सरल कार्य को लागू करने के लिए मुझे अनुबंधों को त्यागना होगा? क्या यह संभव है? – Wodzu

+0

नहीं - आप अभी भी अनुबंध का उपयोग कर सकते हैं, लेकिन DataContractSerializer के बजाय XML Serializer का उपयोग करें, यदि आप वास्तव में ** आपके पास जिस प्रारूप को ढूंढ रहे हैं उसके पास ** होना चाहिए। लेकिन यह अभी भी एक एसओएपी प्रतिक्रिया होगी। –

+0

marc_s: धन्यवाद। विनिर्देश SOAP के बारे में कुछ भी नहीं कहता है। तो मुझे लगता है कि मुझे किसी भी लिफाफे के बिना सिर्फ एक एक्सएमएल भेजने और प्राप्त करने की आवश्यकता है। इस एक्सएमएल को गुणों की आवश्यकता है क्योंकि मैंने इसे अपने प्रश्न में दिखाया है। क्या मैं आपको XMLSerializer का उपयोग करने का तरीका दिखाने के लिए कह सकता हूं? यह 5 वां घंटा है, मैं एक उत्तर की तलाश में खर्च कर रहा हूं और मैं बहुत निराश हूं;) – Wodzu

0

Enunciate पर एक नजर डालें। मैं इसे का उपयोग किया है एक बाकी (एक्सएमएल & & JSON) इंटरफेस के साथ-साथ एक सोप इंटरफेस बनाने के लिए पहले। यह आपको वही दे सकता है जो आप खोज रहे हैं और इसके साथ काम करना बहुत आसान है। इसलिए यदि आप प्रश्न हैं, सिर्फ समूह एक संदेश भेजने और आप आमतौर पर एक प्रतिक्रिया बहुत जल्दी मिल जाएगा नेतृत्व डेवलपर भी मेलिंग सूची पर काफी सक्रिय है।

+0

धन्यवाद रंद्या, उस पर ध्यान देंगे। – Wodzu

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