Тело сообщения Cloud Run пустое в примере Pub Sub

Я следую примеру здесь https://cloud.google.com/run/docs/tutorials/pubsub, за исключением того, что я пытаюсь заставить его работать на C #. У меня он работает в значительной степени до того момента, когда, если я публикую сообщение в теме, которую я создал, он вызывает Cloud Run, который, в свою очередь, вызывает мой метод POST api, однако внутри этого метода POST Body Message всегда имеет значение null. Я пробовал передавать как текст, так и объекты JSON при публикации сообщения. Во всех случаях тело сообщения всегда запускается. Есть идеи, что я здесь делаю неправильно и почему сообщение всегда нулевое?

Вот мой метод поста контроллера.

        [HttpPost]
        public IActionResult Post([FromBody] Body body)
        {
            Body.Message message = body.getMessage();
            if (message == null)
            {
                string msg1 = "Bad Request: invalid Pub/Sub message format";
                Console.WriteLine(msg1);
                return BadRequest(msg1);
            }

            string data = message.getData();
            string target = String.IsNullOrEmpty(data) ? "World" :
                Encoding.Unicode.GetString(Convert.FromBase64String(Convert.ToBase64String(Encoding.Unicode.GetBytes(data))));
            string msg = "Hello " + target + "!";

            Console.WriteLine(msg);
            return Ok(msg);
        }

Вот мой Body.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace cloudrun_pubsub.Models
{
    public class Body
    {

        private Message message;

        public Body() { }

        public Message getMessage()
        {
            return message;
        }

        public void setMessage(Message message)
        {
            this.message = message;
        }

        public class Message
        {

            private String messageId;
            private String publishTime;
            private String data;

            public Message() { }

            public Message(String messageId, String publishTime, String data)
            {
                this.messageId = messageId;
                this.publishTime = publishTime;
                this.data = data;
            }

            public String getMessageId()
            {
                return messageId;
            }

            public void setMessageId(String messageId)
            {
                this.messageId = messageId;
            }

            public String getPublishTime()
            {
                return publishTime;
            }

            public void setPublishTime(String publishTime)
            {
                this.publishTime = publishTime;
            }

            public String getData()
            {
                return data;
            }

            public void setData(String data)
            {
                this.data = data;
            }
        }

        public override string ToString()
        {
            return "Message Data: " + message.getData() + " " 
                    + "Message Id: " + message.getMessageId() + " " 
                    + "Message Publish Time: " + message.getPublishTime() + "." ;
        }
    }
}

И я пробовал публиковать сообщения двумя способами

Test data.

а также

{ 
  "message": {
    "messageId": "Message Id",
    "publishTime": "123",
    "data": "Test data."
  }
}

Это то, что я вижу в журналах StackDriver.

{
 insertId: "5dfa6ecf0001087146655f09"  
 labels: {
  instanceId: "00bf4bf02d946dcf9d9f207e05a85bd978c008d75391808a08560c252798d9b965310e1d2e0f43407b7bfa1d03e46837a64159f2afe2623f90b817"   
 }
 logName: "projects/codelabs-123456/logs/run.googleapis.com%2Fstdout"  
 receiveTimestamp: "2019-12-18T18:24:15.317529704Z"  
 resource: {
  labels: {
   configuration_name: "pubsub-tutorial"    
   location: "us-central1"    
   project_id: "codelabs-123345"    
   revision_name: "pubsub-tutorial-00004-rar"    
   service_name: "pubsub-tutorial"    
  }
  type: "cloud_run_revision"   
 }
 textPayload: "Bad Request: invalid Pub/Sub message format"  
 timestamp: "2019-12-18T18:24:15.067697Z"  
}

а также

{
 httpRequest: {
  latency: "0.069122189s"   
  protocol: "HTTP/1.1"   
  remoteIp: "35.187.139.4"   
  requestMethod: "POST"   
  requestSize: "1646"   
  requestUrl: "https://pubsub-tutorial-12312312-uc.a.run.app/"   
  responseSize: "280"   
  status: 400   
  userAgent: "APIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html)"   
 }
 insertId: "5dfa6ecf0001111dc2b15123"  
 labels: {
  instanceId: "00bf4bf02d946dcf9d9f207e05a85bd978cd75391808a08560c252798d9b965310eb71d2e0f43407b7bfa1d03e46837a64159f2afe2623f90b817"   
 }
 logName: "projects/codelabs-123345/logs/run.googleapis.com%2Frequests"  
 receiveTimestamp: "2019-12-18T18:24:15.210641703Z"  
 resource: {
  labels: {
   configuration_name: "pubsub-tutorial"    
   location: "us-central1"    
   project_id: "codelabs-123456"    
   revision_name: "pubsub-tutorial-00004-rar"    
   service_name: "pubsub-tutorial"    
  }
  type: "cloud_run_revision"   
 }
 severity: "WARNING"  
 timestamp: "2019-12-18T18:24:15.069917Z"  
 trace: "projects/codelabs-123456/traces/8bb4f905bfc568a64bffa978a3ae1617"  
}

person AIK DO    schedule 18.12.2019    source источник


Ответы (1)


Проблема была в классе Body. Я изменил его на следующее, и это сработало.

     public class PostMessage
    {
        public PubsubMessage message { get; set; }
        public string subscription { get; set; }
    }

    /// <summary>
    /// Pubsub's inner message.
    /// </summary>
    public class PubsubMessage
    {
        public string data { get; set; }
        public string messageId { get; set; }
        public Dictionary<string, string> attributes { get; set; }
    }
person AIK DO    schedule 18.12.2019