从WebAPI获取POST数据

时间:2016-09-13 22:24:27

标签: c# asp.net-web-api plivo

我们正致力于开发使用Plivo发送和接收SMS消息的应用程序。对于Plivo发送的每个请求,他们还会在HTTP标头中发送签名,以便我们可以验证来自Plivo的请求,而不是来自随机用户。

https://www.plivo.com/docs/xml/request/#validation

要进行此验证,我们需要POST内容作为查询字符串(例如:To=15555555555&From=11234567890&TotalRate=0&Units=1&Text=Text!&TotalAmount=0&Type=sms&MessageUUID=2be622bc-79f8-11e6-8dc0-06435fceaad7)。

当前解决方案

这是我们到目前为止所做的:

    private bool VerifyPlivo(object thing, HttpRequestMessage Request)
    {
        if (Request.Headers.Contains("X-Plivo-Signature"))
        {
            Dictionary<string, string> reqParams = (from x in thing.GetType().GetProperties() select x).ToDictionary(x => x.Name, x => (x.GetGetMethod().Invoke(thing, null) == null ? "" : x.GetGetMethod().Invoke(thing, null).ToString()));
            IEnumerable<string> headerValues = Request.Headers.GetValues("X-Plivo-Signature");
            string signature = headerValues.FirstOrDefault();
            return XPlivoSignature.Verify(Request.RequestUri.ToString(), reqParams, signature, plivoToken);
        }
        else
        {
            return false;
        }
    }

    [Route("RecieveSMS")]
    [HttpPost]
    public HttpResponseMessage RecieveSMS(PlivoRecieveSMS req)
    {
        if (!VerifyPlivo(req, Request))
        {
            return new HttpResponseMessage(HttpStatusCode.Forbidden);
        }
        ... // do actual work here
    }

这可以通过使用它映射到PlivoRecieveSMS的对象并进行一些反射来获取属性和值,并将它们粘贴到Dictionary中。这很有效,特别是考虑到我们缺乏首选解决方案......

首选解决方案

现在,我们需要一个模型(PlivoRecieveSMS)来映射数据,然后进行内省以找到键/值。我们希望将逻辑移到System.Web.Http.AuthorizeAttribute的扩展名,以便我们可以做一些简单的事情:

    [AuthorizedPlivoApi]
    [Route("RecieveSMS")]
    [HttpPost]
    public HttpResponseMessage RecieveSMS(PlivoRecieveSMS req)
    {
        ... // do actual work here
    }

实际授权在AuthorizedPlivoApi中完成 - 如果它无效,请求永远不会到达控制器。但我们目前无法做到这一点,因为我们无法将其映射到AuthorizedPlivoApi内的特定对象。

我想直接访问POST键的值,或者可能将它映射到一个事先没有预先定义的动态对象。如果我能做到这一点,我们就可以实现我们的首选解决方案。

tl; dr:有没有办法在不使用特定型号的情况下将application/x-www-form-urlencoded数据从POST请求推送到Dictionary<string,string>()

0 个答案:

没有答案