2012-05-10 7 views
6

मैं MTOM/XOP प्रतिक्रिया कैसे दे सकता हूं जो मुझे डब्ल्यूसीएफ का उपयोग कर वेब सेवा से मिलता है? मेरे पास डिस्क पर प्रतिक्रिया है। मैंने नीचे प्रतिक्रिया की प्रतिलिपि बनाई है:एमटीओएम/एक्सओपी डेटा पार्स/deserialize .NET

Date: Wed, 02 May 2012 09:38:57 GMT 
Server: Microsoft-IIS/6.0 
P3P:CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo" 
X-Powered-By: ASP.NET 
X-AspNet-Version: 4.0.30319 
X-WindowsLive-Hydra: H: BLU165-ds6 V: 16.3.133.328 D: 2012-03-29T02:31:31 
X-Response-Time: 78.1245 
X-TransactionID: d491414e-46fd-47b2-82ce-e9cea9f564aa;BLU165-ds6;16.3.133.328;2012-05-02 09:38:57 UTC;78.1245 ms 
Set-Cookie: HMDST=dGVhcG90ZG9tZYtZm3GzLm1r3f+/q8+gdzrAPYmy9kJ+SmDZuFmVgk3E983xNyeoTZkkdIr6t8y3P4V+vPzmytdaqqFwtI8vBuc=; domain=.mail.services.live.com; path=/ 
Cache-Control: no-cache 
Pragma: no-cache 
Expires: -1 
Content-Type: application/xop+xml 
Content-Length: 6386 

MIME-Version: 1.0 
Content-Type: Multipart/Related;boundary=DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM; 
    type="application/xop+xml"; 
    start="<[email protected]>"; 

--DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM 
content-transfer-encoding: binary 
content-type: application/xop+xml; charset=utf-8; type="application/xop+xml" 
content-id: <[email protected]> 

<ItemOperations xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:B="HMMAIL:" xmlns:D="HMSYNC:" xmlns="ItemOperations:"><Status>1</Status><Responses><Fetch><ServerId>E631966A-9439-11E1-8E7B-00215AD9A7B8</ServerId><Status>1</Status><Message><xop:Include href="cid:[email protected]" /></Message></Fetch></Responses></ItemOperations> 
--DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM 
content-transfer-encoding: binary 
content-type: application/octet-stream 
content-id: <[email protected]> 

....Binary Content 
--DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM-- 

किसी भी मदद की बहुत सराहना की जाती है।

+3

पुन: 'एक कक्षा/विधि होनी चाहिए जो मैं कोशिश कर रहा हूं?' क्या यह अच्छा नहीं होगा। अफसोस की बात है, एमएस का कहना है कि वे अपने एमटीओएम कार्यान्वयन में अनुलग्नक नहीं करते हैं। 'Cid' या इसकी सामग्री तक पहुंचने के लिए कोई परिभाषित विधि नहीं है। मैं एक विस्तार कक्षा पर काम कर रहा हूं जो इसे संभाल सकता है (चैनल को कम करके और हाथ से लौटने वाले एमटीओएम को पार्स करके)। यदि मैं कुछ भी ** कार्यात्मक ** के साथ आया तो मैं आपको बता दूंगा। लेकिन ** सुरुचिपूर्ण ** पर अपनी सांस न पकड़ें। –

+0

कभी भी सांस को इतनी देर तक नहीं पकड़ेगा! –

+0

@ user349026 - आपको इसे थोड़ा सा समय तक पकड़ना पड़ सकता है। :(जो मैंने कार्यान्वित किया है, वह कंपनी की संपत्ति है (वकीलों के मुताबिक)। मुझे इसे अपने समय और कंप्यूटर पर फिर से आविष्कार करना होगा, मेरे मूल से काफी अलग तरीके से इसे पोस्ट करने में सक्षम होना चाहिए। –

उत्तर

4

आप डब्ल्यूसीएफ कक्षाओं का उपयोग करके प्रतिक्रिया को निराश कर सकते हैं, जैसा कि मैं नीचे दिखाऊंगा। लेकिन आगे बढ़ने से पहले, यह एमटीओएम अमान्य है - Content-Type हेडर का पैरामीटर boundary खराब है। चूंकि इसमें '?' है चरित्र, इसे उद्धृत करने की आवश्यकता है (MIME RFC, धारा 5.1, token की परिभाषा देखें)।

अब, इसे deserialize करने के लिए, आपको एक एमटीओएम रीडर के साथ दस्तावेज़ खोलने की जरूरत है - और XmlDictionaryReader.CreateMtomReader आपको बिल्कुल वही देगा। उस पाठक के साथ बनाया गया है, आप ऑब्जेक्ट को deserialize करने के लिए इसे DataContractSerializer पर पास कर सकते हैं। नीचे दिया गया कोड दिखाता है कि यह कैसे किया जा सकता है।

public class StackOverflow_10531128 
    { 
     const string MTOM = @"MIME-Version: 1.0 
Content-Type: Multipart/Related;boundary=DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM; 
    type=""application/xop+xml""; 
    start=""<[email protected]>""; 

--DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM 
content-transfer-encoding: binary 
Content-Type: application/xop+xml; charset=utf-8; type=""application/xop+xml"" 
content-id: <[email protected]> 

<ItemOperations xmlns:xop=""http://www.w3.org/2004/08/xop/include"" xmlns:B=""HMMAIL:"" xmlns:D=""HMSYNC:"" xmlns=""ItemOperations:""> 
    <Status>1</Status> 
    <Responses> 
     <Fetch> 
      <ServerId>E631966A-9439-11E1-8E7B-00215AD9A7B8</ServerId> 
      <Status>1</Status> 
      <Message><xop:Include href=""cid:[email protected]"" /></Message> 
     </Fetch> 
    </Responses> 
</ItemOperations> 
--DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM 
content-transfer-encoding: binary 
Content-Type: application/octet-stream 
content-id: <[email protected]> 

this is a binary content; it could be anything but for simplicity I'm using text 
--DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM--"; 

     [DataContract(Name = "ItemOperations", Namespace = "ItemOperations:")] 
     public class ItemOperations 
     { 
      [DataMember(Order = 1)] 
      public int Status { get; set; } 
      [DataMember(Order = 2)] 
      public Responses Responses { get; set; } 
     } 

     [CollectionDataContract(Name = "Responses", Namespace = "ItemOperations:", ItemName = "Fetch")] 
     public class Responses : List<Fetch> 
     { 
     } 

     [DataContract(Name = "Fetch", Namespace = "ItemOperations:")] 
     public class Fetch 
     { 
      [DataMember(Order = 1)] 
      public Guid ServerId { get; set; } 
      [DataMember(Order = 2)] 
      public int Status { get; set; } 
      [DataMember(Order = 3)] 
      public byte[] Message { get; set; } 
     } 

     public static void Test() 
     { 
      MemoryStream ms; 
      ItemOperations obj; 
      DataContractSerializer dcs = new DataContractSerializer(typeof(ItemOperations)); 

      string fixedMtom = MTOM.Replace(
       "Multipart/Related;boundary=DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM;", 
       "Multipart/Related;boundary=\"DeltaSync91ABCB4AF5D24B8F988B77ED7A19733D?MTOM\";"); 
      ms = new MemoryStream(Encoding.UTF8.GetBytes(fixedMtom)); 
      XmlDictionaryReader reader = XmlDictionaryReader.CreateMtomReader(ms, Encoding.UTF8, XmlDictionaryReaderQuotas.Max); 
      obj = (ItemOperations)dcs.ReadObject(reader); 
      Console.WriteLine(obj.Status); 
      Console.WriteLine(obj.Responses.Count); 
      foreach (var resp in obj.Responses) 
      { 
       Console.WriteLine(" {0}", resp.ServerId); 
       Console.WriteLine(" {0}", resp.Status); 
       Console.WriteLine(" {0}", string.Join(" ", resp.Message.Select(b => string.Format("{0:X2}", (int)b)))); 
      } 
     } 
    } 
+0

यदि एमटीओएम एक छवि की एक बाइनरी स्ट्रीम है, और यह आपके उदाहरण में एक स्ट्रिंग में परिवर्तित हो गया है, क्या यह स्ट्रीम दूषित करेगा या नहीं? – Victor

+0

यह एक साधारण उदाहरण है जो डब्लूसीएफ कक्षाओं का उपयोग करके एमटीओएम दस्तावेज़ को पढ़ने के लिए और इसे पूरा करने के लिए दिखा रहा है और स्वयं निहित मैंने फ़ाइल में एक स्ट्रिंग के रूप में एमटीओएम "दस्तावेज़" को कड़ी-कोडित किया। आमतौर पर ऐसा होता है कि दस्तावेज कुछ बाहरी स्रोत (फ़ाइल, नेटवर्क इत्यादि) से पढ़ा जाएगा, और बाइट ठीक से एन्कोड किए जाएंगे (और एमटीओएम रीडर द्वारा सही ढंग से पढ़ा जाएगा)। – carlosfigueira