Cloud 运行 消息正文在 Pub Sub 示例中为空
Cloud Run Message Body is Null in Pub Sub Example
我按照这里的示例 https://cloud.google.com/run/docs/tutorials/pubsub 除了我试图让它在 C# 中工作。我让它工作得很好,如果我在我创建的主题中发布消息,它会调用 Cloud 运行,而 Cloud 运行 又会调用我的 api 的 POST 方法,但是在 POST 方法中,Body Message 始终为 null。我尝试在发布消息时同时传递文本和 JSON 对象。在所有情况下,正文消息始终为 运行。知道我在这里做错了什么以及为什么消息总是空的吗?
这是我的控制器 post 方法。
[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"
}
问题出在正文中 class。我将其更改为以下内容并且有效。
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; }
}
我按照这里的示例 https://cloud.google.com/run/docs/tutorials/pubsub 除了我试图让它在 C# 中工作。我让它工作得很好,如果我在我创建的主题中发布消息,它会调用 Cloud 运行,而 Cloud 运行 又会调用我的 api 的 POST 方法,但是在 POST 方法中,Body Message 始终为 null。我尝试在发布消息时同时传递文本和 JSON 对象。在所有情况下,正文消息始终为 运行。知道我在这里做错了什么以及为什么消息总是空的吗?
这是我的控制器 post 方法。
[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"
}
问题出在正文中 class。我将其更改为以下内容并且有效。
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; }
}