1

我正在尝试使用 asp.net web api 应用程序来处理批处理的 SendGrid 事件,但由于 SendGrid 处理它发送的帖子的内容类型标题的方式,我遇到了一个绊脚石。

从他们的文档中

批处理事件 POST 的内容类型标头为 application/json,每行仅包含一个 JSON 字符串,每一行代表一个事件。请注意,目前 POST 标头将此帖子定义为 application/json,尽管它不是;每行都是有效的 JSON 字符串,但整个 POST 正文不是。

所以,给定一个控制器:

public class SendGridController : ApiController 
{ 
   // POST api/values 
   public void Post([FromBody]string value) 
   { 
   // do something with value
   }
}

像 SendGrid 那样向其发布帖子将导致“值”为空。

string URI = "http://localhost:3018/api/sendgrid/";
string myParameters = 
@"={""email"":""foo@bar.com"",""timestamp"":1322000095,""user_id"":""6"",""event"":""bounced""}
{""email"":""foo@bar.com"",""timestamp"":1322000096,""user_id"":""9"",""event"":""bounced""}";


using (var wc = new System.Net.WebClient())
{
    wc.Headers[System.Net.HttpRequestHeader.ContentType] = "application/json"; // I work fine if "application/x-www-form-urlencoded" is used.
    wc.UploadString(URI, myParameters);
}

如果我将客户端示例中的内容类型更改为“application/x-www-form-urlencoded”,一切都会按预期工作。

是否有一种简单的方法可以覆盖此约定,以便我可以处理 sendgrid 在我的控制器方法中作为字符串提供的格式错误的“json”?

4

1 回答 1

1

好的,我终于想通了。诀窍是删除“值”参数并直接使用请求对象。

所以像:

public class SendGridController : ApiController 
{ 
   // POST api/values 
   public void Post() 
   { 
      var value = Request.Content.ReadAsStringAsync().Result;
      // do something with value
   }
}
于 2013-04-23T17:25:34.673 回答