【问题标题】:Parse an email address string in C# to MailAddress object将 C# 中的电子邮件地址字符串解析为 MailAddress 对象
【发布时间】:2021-03-23 23:43:26
【问题描述】:

我有一个 C# 后端代码,它从 TypeScript 中的客户端代码接收 POST 请求。

使用 JSON.stringify(objectOfData); 为 POST 完成 JSON;

在 C# 代码中,当我尝试像这样使用对象时遇到异常:

// Passed into this function is InboundObjectDTO inboundObject

// inboundObject.Email in debugger is like so: "\"a@example.com\""

var message = new MailMessageDTO
{
    Subject = "My Subject",
    MailAddresses = new List<MailAddress>()
};

message.MailAddresses.Add(new MailAddress(inboundObject.Email));

我应该事先以某种方式反序列化对象吗?我在对象中有 3 个字符串:电子邮件、消息和姓名。

上面的最后一行代码给了我“MailAddresses 异常中的一个无效字符”。我猜它需要以适当的方式删除所有额外的引号。

【问题讨论】:

  • 您的电子邮件地址中可能包含 Unicode 字符。请参阅:medium.com/@zackbloom/…
  • 我们如何解决这个问题?
  • @cdub inboundObject.Email 似乎仍然包含\"。你也可以在inboundObject.Email 的第 1 行运行你的替换语句吗?
  • 为什么在所有 3 个值中仍然有 \"?
  • 我想把它全局删除。

标签: c# asp.net-core .net-core asp.net-core-3.1


【解决方案1】:

正如 OP 最初假设的那样,问题在于电子邮件地址周围的引号,我们需要做的就是删除这些引号。这个过程被称为清理输入。

原始方法难以遵循,并且发布的异常信息不明确,此解决方案展示了如何清理输入并返回更多相关信息与异常。

如果您只是使用 sanitize 步骤的结果,您粘贴的示例“a@example.com”不会在包含清理逻辑的原始代码中失败!

您应该将代码块包装在 try-catch 中,以便捕获异常并输出失败的特定字符串值:

string email = inboundObject.Email;
MailMessageDTO message = null;
try
{
    // sanitized the email, removed known invalid characters
    email = email.Replace("\"", "");

    // construct the payload object
    message = new MailMessageDTO
    {
        Subject = "My Subject",
        MailAddresses = new List<MailAddress>()
    };
    message.MailAddresses.Add(new MailAddress(email));
}
catch (Exception ex)
{
    throw new ApplicationException($"Failed to construct MailMessage for email: {email}", ex);
}

现在,当这失败时,我们可以在异常中处理更多信息,事实上这种情况本身可能需要它自己的单独可重用方法:

public MailAddress SanitizeEmail(string emailAddress)
{
    string email = emailAddress;
    try
    {
        // sanitized the email, removed known invalid characters
        email = email.Replace("\"", "");
        
        // TODO: add other rules an replacement cases as you find them

        return new MailAddress(email);
    }
    catch (Exception ex)
    {
        throw new ApplicationException($"Failed to sanitize email address: '{email}' [original input: '{emailAddress ?? "NULL" }']", ex);
    }
}

你可以这样称呼它:

message.MailAddresses.Add(SanitizeEmail(email));

更新

OP 的原始代码包含已发布代码中不再包含的引用和测试条件,此响应仅进行了少量更新以反映这些更改

【讨论】:

    【解决方案2】:

    如果您将 json 数据发布到控制器操作,您可以使用 [FromBody],[FromBody] 将从请求正文中获取值:

    public IActionResult Index([FromBody]inboundObject inboundObject)
    {
        ...
    }
    

    或者您可以使用JsonConvert.DeserializeObject 将 JSON 反序列化为指定的 .NET 类型:

    message.MailAddresses.Add(new MailAddress(JsonConvert.DeserializeObject<string>(inboundObject.Email)));
    

    【讨论】:

      猜你喜欢
      • 2015-05-02
      • 2013-02-04
      • 2011-01-07
      • 2012-09-14
      • 2022-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 2014-01-11
      相关资源
      最近更新 更多