C # работает, но в PHP я не могу получить информацию - PullRequest
0 голосов
/ 28 мая 2018

Добрый день.

У меня есть пример, присланный для меня через 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.

}

1 Ответ

0 голосов
/ 06 июня 2018

Исходя из вашего ProcessSavedCosting метода, я предположил, что если вы используете клиентскую библиотеку .NET ServiceBus WindowsAzure.ServiceBus для отправки сообщений очереди, то код может выглядеть следующим образом:

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

Как BrokeredMessage сообщает о конструкторе BrokeredMessage (Object) :

Инициализирует новый экземпляр класса BrokeredMessage из заданногоОбъект с помощью DataContractSerializer с двоичным XmlDictionaryWriter.

Для стороны получателя будет использоваться соответствующий метод для десериализации тела сообщения.Например, BrokeredMessage.GetBody<T>() описывается следующим образом:

Десериализует тело сообщения-посредника в объект указанного типа с помощью DataContractSerializer с двоичным XmlDictionaryReader.

ServiceBusTrigger может правильно десериализовать тело сообщения.

Для просмотра отправленных сообщений в очереди вы можете использовать Service Bus Explorer или напрямую загрузить его с здесь .

Кроме того, я проверилИсходный код клиентской библиотеки Service Bus для PHP о BrokeredMessage.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 вы могли бы следовать этой аналогичной проблеме .

...