WebAPI控制器看不到价值

时间:2018-08-03 07:29:41

标签: c# asp.net-web-api asp.net-core asp.net-core-mvc

我有sendemail控制器

这是界面代码

  public interface IEmailService
   {
       Task SendEmail(string email, string subject, string message);
   }

这是API控制器

 [Route("api/send-email")]
[ApiController]
public class EmailController : ControllerBase
{
    private readonly IEmailService _emailService;
    public EmailController(IEmailService emailService)
    {
        _emailService = emailService;
    }

    [HttpPost]
    public async Task<IActionResult> SendEmailAsync(string email, string subject, string message)
    {
        await _emailService.SendEmail(email, subject, message);
        return Ok();
    }

}

这是SendEmail类的代码

public class EmailService: IEmailService
{
    private readonly IConfiguration _configuration;
    public EmailService(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public async Task SendEmail(string email, string subject, string message)
    {
        using (var client = new SmtpClient())
        {
            var credential = new NetworkCredential
            {
                UserName = _configuration["Email:Email"],
                Password = _configuration["Email:Password"]
            };

            client.Credentials = credential;
            client.Host = _configuration["Email:Host"];
            client.Port = int.Parse(_configuration["Email:Port"]);
            client.EnableSsl = true;

            using (var emailMessage = new MailMessage())
            {
                emailMessage.To.Add(new MailAddress(email));
                emailMessage.From = new MailAddress(_configuration["Email:Email"]);
                emailMessage.Subject = subject;
                emailMessage.Body = message;
                client.Send(emailMessage);
            }
        }
        await Task.CompletedTask;
    }
}

我尝试通过邮递员检查发布请求,然后将此json发送到此网址-https://localhost:5001/api/send-email

  

{       “电子邮件”:“ suhomlin.eugene93@gmail.com”,       “主题”:“吃药”,       “消息”:null   }

但是我收到错误消息,该电子邮件为空。 这是错误的画面

enter image description here

我不明白,为什么?我的错误在哪里?

2 个答案:

答案 0 :(得分:1)

我认为POST请求的绑定方式与您期望GET请求默认绑定的方式不同。您可以执行以下两项操作:

1)创建一个请求对象,而不是3个字符串

public class SendEmailRequest
{
    public string Email {get; set;}
    ...
}

2)按照评论中的建议进行操作

我建议使用前一种方法,这是我认为的一种更简洁的方法,并且在我的应用程序中使用了该方法。

答案 1 :(得分:1)

尝试修改,创建具有API数据属性的实体类:

public class Data
{
  public string email {get;set;}
  public string subject {get;set;}
  public string message {get;set;}
}

现在如下更改API服务:

[HttpPost]
    public async Task<IActionResult> SendEmailAsync([FromBody] Data d)
    {
        await _emailService.SendEmail(d.email, d.subject, d.message);
        return Ok();
    }

现在您的邮递员服务将按预期工作,并从Request Body接收数据

编辑1

以下是其他选择,以防您希望使用查询字符串发送数据:

  1. public async Task<string> SendEmailAsync(string email, string subject, string message)

  2. public async Task<string> SendEmailAsync([FromUri]Data d)

在上述两种情况下,以下查询均有效:

https://localhost:5001/api/send-email?subject=Get Medicine&email=suhomlin.eugene93@gmail.com

尽管第一个优先级高,请注意,我没有在参数中传递消息,因为它在您原始查询中的空值和命令或参数可以是任何东西。

如讨论中所建议,如果Data未被明确限定,则它期望Json数据作为Http Request Body