我正在创建一个批处理作业,以使用 Microsoft Graph API 从收件箱读取电子邮件并使用服务总线发布电子邮件内容。 我根据分配的消息 ID 在我的 Azure 服务总线中进行了重复检测。为了防止发布相同的电子邮件,我将电子邮件消息 ID 放入 Azure 服务总线消息 ID。
但是,电子邮件消息 ID 的长度似乎太长,我无法将其用作 azure 服务总线消息 ID。有关如何将电子邮件消息 ID 作为 Azure 服务总线消息 ID 的任何解决方案吗? (我不允许将电子邮件 ID 存储在任何持久性存储中,我只能通过 Azure 服务总线发布它)
谢谢
最佳答案
服务总线消息 ID 的长度不能超过 128 个字符。一般来说,值 您从 Microsoft Graph API 检索到的电子邮件 ID 如下所示:
AAMkADU1NzNkY2I2LWIxY2QtNGFhOC1iYmE5LWEzODA2ZjJkMjQxNwBGAAAAAABRRlt89urpT62rDl3o5R1RBwCSQ84srYEXTY2slhDtcrhrAAAAAAEMAACSQ84srYEXTY2slhDtcrhrAABlQp2FAAA=
一般来说,它的长度是188个字符,这导致了这个问题。
要解决这个问题,您可以尝试使用MD5为电子邮件ID创建一个统一的标识符,默认情况下,其长度将为32个字符,尽管这个值有可能与来自不同字符串的哈希,但其可能性很低(大约2^-128)。
如果您使用 C#,只需尝试以下代码:
using Azure.Messaging.ServiceBus;
using System;
using System.Security.Cryptography;
using System.Text;
namespace serviceBusTest
{
class Program
{
static void Main(string[] args)
{
string connectionString = "";
string queueName = "";
var client = new ServiceBusClient(connectionString);
ServiceBusSender sender = client.CreateSender(queueName);
ServiceBusMessage message = new ServiceBusMessage();
var emailID = "AAMkADU1NzNkY2I2LWIxY2QtNGFhOC1iYmE5LWEzODA2ZjJkMjQxNwBGAAAAAABRRlt89urpT62rDl3o5R1RBwCSQ84srYEXTY2slhDtcrhrAAAAAAEMAACSQ84srYEXTY2slhDtcrhrAABlQp2FAAA=";
message.MessageId = GetMd5Hash(MD5.Create(), emailID);
sender.SendMessageAsync(message).GetAwaiter().GetResult();
ServiceBusReceiver receiver = client.CreateReceiver(queueName);
ServiceBusReceivedMessage receivedMessage = receiver.ReceiveMessageAsync().GetAwaiter().GetResult();
Console.WriteLine(receivedMessage.MessageId);
}
static string GetMd5Hash(MD5 md5Hash, string input)
{
byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}
}
}
结果:
关于Azure 服务总线消息 ID 我们的电子邮件 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65339100/