2014-04-30 34 views
0

我正在开发一个项目,我们希望通过Azure服务总线(主题)发送消息。在这个例子中,我设置了一个C#控制台应用程序和一个在它们之间发送和接收消息的Java应用程序。Azure服务总线 - 数据传输问题

从C#发送消息时,我在Java中得到一个奇怪格式的字符串,其中包含“schema.microsoft.com/2003/10/serialisation”。更改消息内容类型没有区别。

从Java发送数据到C#时,我得到一个异常。

发送/接收数据 - C#

private static void SendMessages() 
    { 
     topicClient = TopicClient.Create(TopicName); 

     List<BrokeredMessage> messageList = new List<BrokeredMessage>(); 
     messageList.Add(CreateSampleMessage("1", "Test")); 

     Console.WriteLine("\nSending messages to topic..."); 

     foreach (BrokeredMessage message in messageList) 
     { 
      while (true) 
      { 
       try 
       { 
        topicClient.Send(message); 
       } 
       catch (MessagingException e) 
       { 
        if (!e.IsTransient) 
        { 
         Console.WriteLine(e.Message); 
         throw; 
        } 
        else 
        { 
         HandleTransientErrors(e); 
        } 
       } 
       Console.WriteLine(string.Format("Message sent: Id = {0}, Body = {1}", message.MessageId, message.GetBody<string>())); 
       break; 
      } 
     } 
     topicClient.Close(); 
    } 

    private static BrokeredMessage CreateSampleMessage(string messageId, string messageBody) 
    { 
     BrokeredMessage message = new BrokeredMessage(messageBody); 
     message.MessageId = messageId; 
     return message; 
    } 

C#堆栈跟踪

{“发生错误反序列化类型System.String对象文件的意外结束之后。元素不关闭:“}

at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName) 
    at Microsoft.ServiceBus.Messaging.DataContractBinarySerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName) 
    at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader) 
    at Microsoft.ServiceBus.Messaging.DataContractBinarySerializer.ReadObject(Stream stream) 
    at Microsoft.ServiceBus.Messaging.BrokeredMessage.GetBody[T](XmlObjectSerializer serializer) 
    at Microsoft.ServiceBus.Messaging.BrokeredMessage.GetBody[T]() 
    at Microsoft.Samples.MessagingWithTopics.program.ReceiveMessages() in d:\Downloads\Getting Started Messaging With Topics (1)\C#\MessagingWithTopics\program.cs:line 127 
    at Microsoft.Samples.MessagingWithTopics.program.Main(String[] args) in d:\Downloads\Getting Started Messaging With Topics (1)\C#\MessagingWithTopics\program.cs:line 39 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 

    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

回答

0

a)您不能从.NET使用AMQP。只有这样你才能获得AMQP编码。将TransportType = Amqp附加到连接字符串。然后使用Apache Proton-J的JMS提供程序。 b)如果您使用来自Java的HTTP,请尝试通过自我序列化的流(Stream参数化构造函数)或使用(object,XmlObjectSerializer)参数化构造函数的DataContractSerializer显式构造消息。这会给你一个XML测试有效载荷。默认情况下,我们使用NetDataContractSerializer,它产生一个紧凑的编码,但仅限于.NET。

+0

是否有关于使用Proton-J的JMS与Azure和Java的任何文档?即使遵循MSDN教程,我仍然遇到错误,比如甚至没有从我导入的库中找到类。 –