2017-01-16 98 views
2

我对MVC和Web API很陌生。 我想发布一个MailMessage(System.Net.Mail)对象到我创建的web api,但该对象在API处被接收为空。我使用ReshSharp调用下面的API是我的代码:在MVC Web API post方法中收到MailMessage对象为空

MailMessage myMail = new System.Net.Mail.MailMessage("[email protected]", "[email protected]"); 
myMail.Subject = "Test message from client"; 
myMail.SubjectEncoding = System.Text.Encoding.UTF8; 
myMail.Body = "<b>Test Mail</b><br>using <b>HTML from client</b>."; 
myMail.BodyEncoding = System.Text.Encoding.UTF8; 
myMail.IsBodyHtml = true; 

RestClient client = new RestClient("http://localhost:53014/api/email"); 
var request = new RestRequest("SendMailMessage", Method.POST); 
var json = request.JsonSerializer.Serialize(myMail); 
request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody); 
request.RequestFormat = DataFormat.Json; 
var res = client.Execute(request); 

这是我的API方法:

[HttpPost] 
public void SendMailMessage([FromBody]MailMessage myEmail) 
{ 
    //Code to send email 
} 

这是我收到的API结束: API Post method

我也试过这种方式,但输出相同:

request = new RestRequest("SendMailMessage", Method.POST); 
request.RequestFormat = DataFormat.Json; 
request.AddBody(myMail); 
res = client.Execute(request); 

我h大街也尝试了Newtonsoft.Json序列化器来序列化对象,但没有成功 var json = JsonConvert.SerializeObject(myMail);

任何人都可以建议我在这里错过了什么?

+0

创建自定义模型/视图模型/有效内容以保存要发送到动作的信息,然后使用提供给动作的属性在动作中构造邮件消息。尝试发送MailMessage是有问题的。 – Nkosi

回答

0

尝试发送MailMessage是有问题的。

您应该创建一个自定义对象来保存要发送到Web API的信息...

public class Email { 
    public string Body { get; set; }   
    public bool IsBodyHtml { get; set; } 
    public string Subject { get; set; } 
    public string[] To { get; set; } 
    //...Any other properties you deem relevant 
    //eg: public string From { get; set; } 
} 

保持简单。

所以,现在则可以将自定义对象发送到Web API

var myMail = new Email() { 
    To = new [] { "[email protected]" }, 
    Subject = "Test message from client", 
    Body = "<b>Test Mail</b><br>using <b>HTML from client</b>.", 
    IsBodyHtml = true 
};  

var client = new RestClient("http://localhost:53014/api/email"); 
var request = new RestRequest("SendMailMessage", Method.POST); 
var json = request.JsonSerializer.Serialize(myMail); 
request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody); 
request.RequestFormat = DataFormat.Json; 
var res = client.Execute(request); 

然后使用提供给该操作的性质的行动构建邮件。

public class EmailController : ApiController { 

    [HttpPost] 
    public async Task<IHttpActionResult> SendMailMessage([FromBody]Email message) { 

     if (ModelState.IsValid) { 
      var myMail = new System.Net.Mail.MailMessage(); 
      myMail.Subject = message.Subject; 
      myMail.SubjectEncoding = System.Text.Encoding.UTF8; 
      myMail.Body = message.Body; 
      myMail.BodyEncoding = System.Text.Encoding.UTF8; 
      myMail.IsBodyHtml = message.IsBodyHtml; 
      myMail.From = new MailAddress("[email protected]"); 

      foreach (var to in message.To) { 
       myMail.To.Add(to); 
      } 

      //...Code to send email 
     } 
     return BadRequest(ModelState); 
    } 

} 
+0

为什么它有问题,是否因为MailMessage不可序列化?建立自定义类型是我认为唯一的方式是最后一种方式? – Rakesh

+0

我想我只会这样做,但我不能将其标记为答案。 – Rakesh