如何使用REST API提交代理消息

时间:2011-10-17 03:35:10

标签: azure servicebus

根据MSDN,可以通过REST API提交Brokered Message,并且此代理消息可以将Properties键值对作为消息的一部分。我已经能够提交Brokered消息,但是当我收到消息时,消息中的Properties字段不会被填充。我必须错误地编码Properties JSON。

以下是代码段

        WebClient webClient = new WebClient();
        webClient.Headers[HttpRequestHeader.Authorization] = _token;
        webClient.Headers["Content-Type"] = "application/atom+xml;type=entry;charset=utf-8";
        Guid messageId = Guid.NewGuid();
        webClient.Headers["BrokerProperties"] = @"{""MessageId"": ""{" + messageId.ToString("N") + @"}"", ""TimeToLive"" : 900, ""Properties"": [{""Key"" : ""ProjectId"", ""Value"" : """ + message.ProjectId + @"""}]}";

        // Serialize the message
        MemoryStream ms = new MemoryStream();
        DataContractSerializer ser = new DataContractSerializer(typeof(RespondentCommitMessage));
        ser.WriteObject(ms, message);
        byte[] array = ms.ToArray();
        ms.Close();

        byte[] response = webClient.UploadData(fullAddress, "POST", array);
        string responseStr = Encoding.UTF8.GetString(response);

有没有人有使用BrokerProperties HTTP标头提交BrokeredMessage的示例?

2 个答案:

答案 0 :(得分:3)

似乎servicebus团队在http://servicebus.codeplex.com/的codeplex上提供了一些silverlight和windows phone服务总线样本。我很快查看了silverlight聊天示例的代码,看起来我需要通过RESTFull API发布代理消息。

答案 1 :(得分:2)

我自己不得不对Azure Service Bus的REST API进行一些调查/工作,我将为您节省挖掘已接受答案中列出的Silverlight聊天示例的麻烦并给您实际的低调

您需要知道两件事:

1)BrokerProperties HTTP请求标头不等于BrokeredMessage.Properties集合

BrokeredMessage对象上的Properties字典是自定义属性的集合,而BrokerProperties HTTP Request Header是指定通常与BrokeredMessage关联的内置属性的位置,例如Label,TimeToLive等。

2)所有自定义HTTP请求标头都被视为自定义属性

从MSDN:除了这些属性(引用BrokerProperties)之外,您还可以指定自定义属性。如果发送或接收单个消息,则每个定制属性都放在其自己的HTTP标头中。如果发送了一批消息,则自定义属性是JSON编码的HTTP正文的一部分。

这意味着您要添加自定义属性所需要做的就是添加标题,例如:

    public static void SendMessageHTTP(string bodyContent, params KeyValuePair<string,object>[] properties)
    {
        //BrokeredMessage message = new BrokeredMessage(bodyContent);            
        //foreach(var prop in properties)
        //{
        //    message.Properties[prop.Key] = prop.Value;
        //}

        ...

        WebClient webClient = new WebClient();
        webClient.Headers[HttpRequestHeader.Authorization] = token;
        webClient.Headers[HttpRequestHeader.ContentType] = "application/atom+xml;type=entry;charset=utf-8";

        foreach (var prop in properties)
        {
            webClient.Headers[prop.Key] = prop.Value.ToString();
        }
        webClient.Headers["MyCustomProperty"] = "Value";

        webClient.UploadData(messageQueueURL, "POST", Encoding.UTF8.GetBytes(bodyContent));            
    }

非常值得一读的是MSDN reference on the Send Message API endpointintroduction to the REST API itself(这是它讨论自定义属性的地方)。还有an article with sample code here on the Azure Website documentation