【问题标题】:C# working but in PHP I cannot get the infoC# 工作,但在 PHP 中我无法获取信息
【发布时间】:2018-06-06 15:34:59
【问题描述】:

美好的一天。

我有一个通过 C# 和 Visual Studio 发送给我的示例。

在这个 C# 示例中,我们提取一个序列号。

但尝试在 PHP 中创建时,我无法从服务总线复制相同的信息。 下面是C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ServiceBus.Messaging;
using System.IO;
using System.Configuration;
using Microsoft.ServiceBus;
using Microsoft.Azure.WebJobs;

namespace ComputeWebJobsSDKServiceBus1
{ {  public static void Main()
        {string _servicebusconnectionstring = @"Endpoint=sb://travelvision-****.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=****=";
  JobHostConfiguration config = new JobHostConfiguration();
 config.UseServiceBus(new Microsoft.Azure.WebJobs.ServiceBus.ServiceBusConfiguration()
            {ConnectionString = _servicebusconnectionstring});
config.StorageConnectionString = "DefaultEndpointsProtocol=https;AccountName=****;AccountKey=****==;EndpointSuffix=core.windows.net";
 config.DashboardConnectionString = "DefaultEndpointsProtocol=https;AccountName=****;AccountKey=****==;EndpointSuffix=core.windows.net";
JobHost host = new JobHost(config);
host.RunAndBlock();
        }

    }
}

functions.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.ServiceBus.Messaging;
using ExampleForPaul;


namespace ComputeWebJobsSDKServiceBus1
{
    public class Functions
    {
        public static void ProcessSavedCosting(
            [ServiceBusTrigger("costingsave")] decimal Seq)
        {
            Console.WriteLine("Costing #" + Seq);


            Console.WriteLine("Writing " + Seq.ToString() + " to DB...");
            var Mielie = new ExampleForPaul.SQLFunctions();
            Mielie.Insert(decimal.Parse(Seq.ToString()),DateTime.Now,"testTwo");

            Console.ReadLine();
        }

    }
}

运行的是 Visual Studio,它会带回一个序列号

现在尝试在 PHP 中复制它,我根本没有得到 seq。但只是消息信息。

Body: @decimal3http://schemas.microsoft.com/2003/10/Serialization/�1
sequenceNumber: 71001143
Content Type: application/XML; charset=UTF-8
MessageID: 03ea079c3ecb4d9f832c15ea948e2919

这是我的 PHP 代码

<?php

require_once 'vendor/autoload.php';

use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
use WindowsAzure\ServiceBus\Models\ReceiveMessageOptions;

$connectionString = "Endpoint=https://****-****.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=****=";
$serviceBusRestProxy = ServicesBuilder::getInstance()->createServiceBusService($connectionString);
try    {
    // Set the receive mode to PeekLock (default is ReceiveAndDelete).
    $options = new ReceiveMessageOptions();
    $options->setPeekLock();

    // Receive message.
    $message = $serviceBusRestProxy->receiveQueueMessage("costingsave", $options);
    echo "Body: ".$message->getBody()."<br />";
   echo "sequenceNumber: ".$message->getsequenceNumber()."<br />";
    echo "Content Type: ".$message->getcontentType()."<br />";
    echo "MessageID: ".$message->getMessageId()."<br />";

//print_r($message);


}
catch(ServiceException $e){

    $code = $e->getCode();
    $error_message = $e->getMessage();
  //  echo $code.": ".$error_message."<br />";





// View messages.

}

【问题讨论】:

    标签: c# php azure azure-functions


    【解决方案1】:

    根据您的ProcessSavedCosting 方法,我假设如果您使用.NET ServiceBus 客户端库WindowsAzure.ServiceBus 发送队列消息,那么代码可能如下所示:

    _queueClient.Send(new BrokeredMessage(2.2m));
    

    正如BrokeredMessage 所说的构造函数BrokeredMessage(Object)

    使用带有二进制 XmlDictionaryWriter 的 DataContractSerializer 从给定对象初始化 BrokeredMessage 类的新实例。

    对于接收方,它会使用相应的方法对消息体进行反序列化。比如BrokeredMessage.GetBody&lt;T&gt;()描述如下:

    通过使用带有二进制 XmlDictionaryReader 的 DataContractSerializer 将代理消息体反序列化为指定类型的对象。

    ServiceBusTrigger 可以正确反序列化消息正文。

    要查看您发送的队列消息,您可以利用Service Bus Explorer 或直接从here 下载。

    另外,我查看了关于BrokeredMessage.php 的PHP 服务总线客户端库的源代码,getBody 方法只返回消息文本,它不会自动为您处理反序列化。如果使用 PHP 的相关客户端库发送队列消息,则不会遇到此问题。

    $message = new BrokeredMessage();
    $message->setBody("my message");
    
    // Send message.
    $serviceBusRestProxy->sendQueueMessage("myqueue", $message);
    

    如果您通过 .NET 库或 REST API 发送队列消息,您可能会避免使用 DataContractSerializer 来序列化您的消息,或者您需要手动反序列化消息正文。对于 .NET SDK,您可以利用 BrokeredMessage(Stream) 构造函数发送消息,对于 REST 方法,您可以遵循类似的 issue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多