2013-07-16 9 views
5

हम Azure सेवा बस क्लाइंट के आसपास नीचे आवरण है SendMessage चलाकर Service Bus Explorer 2.0 का उपयोग करके संदेश सामग्री को देखकर इन कार्यों को जांचने के लिए। हम यह सुनिश्चित करने के लिए कर रहे हैं कि हम XML को संशोधित करने के लिए टूल का उपयोग करके संदेशों को सुधार और पुनः भेज सकें। संदेश जो मैं भेज रहा हूं वह इस तरह दिखता है:एन्कोडिंग

[DataContract] 
public class TestServiceBusMessage 
{ 
    [DataMember] 
    public Guid ExternalIdentifier { get; set; } 

    [DataMember] 
    public int Identifier { get; set; } 

    [DataMember] 
    public string Name { get; set; } 
} 

समस्या है;

@TestServiceBusMessageWhttp://schemas.datacontract.org/2004/07/IntegrationTests.Common.Azure.ServiceBus i)http://www.w3.org/2001/[email protected][email protected] 
Identifier?& @Name?Test Message 

मुझे लगता है कि यह एक एन्कोडिंग मुद्दा है, जब संदेश के मुख्य भाग उपकरण पर देखा जाता है, बजाय एक्सएमएल की तरह लग रही के बजाय बाहर से नीचे की तरह आता है हालांकि मैं BrokeredMessage कन्स्ट्रक्टर में शरीर को पार करते समय एन्कोडिंग सेट करने का कोई तरीका नहीं देख सकता; या DataContract विशेषता के माध्यम से इसे परिभाषित करना।

मैं इस एन्कोडिंग समस्या के आसपास कैसे पहुंचूँगा? क्या मुझे अपना खुद का serializer/stream प्रदान करना होगा या डिफ़ॉल्ट सीरिएलाइज़र को सही ढंग से एन्कोड करने के लिए मजबूर करने का कोई तरीका है?

उत्तर

7

निम्नलिखित कोड आज़माएं। मैंने इसका परीक्षण किया और मैं अपने टूल (सर्विस बस एक्सप्लोरर: http://code.msdn.microsoft.com/windowsazure/Service-Bus-Explorer-f2abca5a#content) का उपयोग कर एक्सएमएल प्रारूप में पेलोड देख सकता हूं। मूल रूप से, आपको ब्रोकर्ड मैसेज ऑब्जेक्ट के निर्माता में डेटाकंट्रैक्टसाइराइज़र को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। उम्मीद है की यह मदद करेगा। Ciao पाओलो

#region MyRegion 
using System; 
using System.Runtime.Serialization; 
using Microsoft.ServiceBus; 
using Microsoft.ServiceBus.Messaging; 
#endregion 

namespace StackOverflow 
{ 
    static class Program 
    { 
     #region Private Constants 
     private const string QueueName = "stackoverflow"; 
     private const string MessageType = "MessageType"; 
     private const string AssemblyName = "AssemblyName"; 
     private const string ConnectionString = "<your-service-bus-namespace-connectionstring>"; 
     #endregion 

     #region Static Methods 
     static void Main() 
     { 
      SendMessage(); 
     } 

     static async void SendMessage() 
     { 
      try 
      { 
       // Create NamespaceManager object 
       var namespaceManager = NamespaceManager.CreateFromConnectionString(ConnectionString); 
       Console.WriteLine("NamespaceManager successfully created."); 

       // Create test queue 
       if (!namespaceManager.QueueExists(QueueName)) 
       { 
        namespaceManager.CreateQueue(new QueueDescription(QueueName) 
        { 
         RequiresDuplicateDetection = false, 
         RequiresSession = false, 
         LockDuration = TimeSpan.FromSeconds(60) 
        }); 
        Console.WriteLine("Queue successfully created."); 
       } 

       // Create MessagingFactory object 
       var messagingFactory = MessagingFactory.CreateFromConnectionString(ConnectionString); 
       Console.WriteLine("MessagingFactory successfully created."); 

       // Create MessageSender object 
       var messageSender = await messagingFactory.CreateMessageSenderAsync(QueueName); 
       Console.WriteLine("MessageSender successfully created."); 

       // Create message payload 
       var testServiceBusMessage = new TestServiceBusMessage 
       { 
        ExternalIdentifier = Guid.NewGuid(), 
        Identifier = 1, 
        Name = "Babo" 
       }; 

       // Create BrokeredMessage object 
       using (var brokeredMessage = new BrokeredMessage(testServiceBusMessage, 
                   new DataContractSerializer(typeof(TestServiceBusMessage))) 
       { 
        Properties = {{MessageType, typeof(TestServiceBusMessage).FullName}, 
            {AssemblyName, typeof(TestServiceBusMessage).AssemblyQualifiedName}} 
       }) 
       { 
        //Send message 
        messageSender.SendAsync(brokeredMessage).Wait(); 
       } 
       Console.WriteLine("Message successfully sent."); 
       Console.WriteLine("Press [Enter] to exit"); 
       Console.ReadLine(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       Console.WriteLine("Press [Enter] to exit"); 
       Console.ReadLine(); 
      } 
     } 
     #endregion 
    } 

    [DataContract] 
    public class TestServiceBusMessage 
    { 
     [DataMember] 
     public Guid ExternalIdentifier { get; set; } 

     [DataMember] 
     public int Identifier { get; set; } 

     [DataMember] 
     public string Name { get; set; } 
    } 
} 
+0

कि पूरी तरह से काम किया; कन्स्ट्रक्टर में 'DataContractSerializer' उदाहरण जोड़ने से एन्कोडिंग समस्या हल हो जाती है, धन्यवाद पाओलो। (पीएस: [एज़ूर सर्विस बस एक्सप्लोरर] (http://blogs.msdn.com/b/paolos/archive/2013/04/12/service-bus-explorer-2-0-released.aspx) उत्कृष्ट है) –

+3

इसके अलावा मैंने अपने ब्लॉग पर एक पोस्ट प्रकाशित किया है जिसमें संदेशों को भेजने और प्राप्त करने के लिए विभिन्न प्रोटोकॉल/प्लेटफ़ॉर्म का उपयोग करते समय संदेश निकाय को एन्कोड/डीकोड कर सकते हैं: http://abhishekrlal.com/2012/03/30/formatting ----content-for-service-bus-messages/ –

+0

क्या कोई कार्यवाही है जब संदेश पहले से ही DeadLetter कतार में बैठा है? जैसा कि मैं भेजने के तंत्र को संशोधित किए बिना, पहले से भेजे गए संदेश को दिखाने के लिए एसबीई प्राप्त कर सकता हूं। हमें एक समस्या है कि हम एसबीई के माध्यम से संदेशों को पुनः सबमिट नहीं कर सकते हैं। ऐसा लगता है कि एसबीई केवल 'नए ब्रोकर्ड मैसेज (बॉडी) का उपयोग करते समय बनाए गए संदेशों को पुनः सबमिट नहीं कर सकता; ' – Botis

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