5

I would like to implement Mailgun's webhooks into my .Net Web API application, but some of the parameters they POST have dash'es in them. How do I get around that?

Example of what they post:

client-type=browser&city=San+Francisco&domain=telzio.com&device-type=desktop&my_var_1=Mailgun+Variable+%231&country=US&region=CA&client-name=Chrome&user-agent=Mozilla%2F5.0+%28X11%3B+Linux+x86_64%29+AppleWebKit%2F537.31+%28KHTML%2C+like+Gecko%29+Chrome%2F26.0.1410.43+Safari%2F537.31&client-os=Linux&my-var-2=awesome&ip=50.56.129.169&recipient=alice%40example.com&event=opened&timestamp=1405017113&token=6khi46bvupa1358v0b3iy29kwumpbajb3ioz4illb6v9bbqkp6&signature=88f46b9ba63ff475bbb3ab193696cf45bf2f25e7e62b44f1e492ff4e085730dd

My model:

public class MailgunModel
{
    public string City { get; set; }
    public string Domain { get; set; }
    public string Country { get; set; }
    public string Region { get; set; }
    public string Ip { get; set; }
    public string Recipient { get; set; }
    public string Event { get; set; }
    public long Timestamp { get; set; }
    public string Token { get; set; }
    public string Signature { get; set; }

    public string ClientType get; set; }
    public string DeviceType { get; set; }
    public string ClientName { get; set; }
    public string UserAgent { get; set; }
    public string ClientOs { get; set; }
}
Peter Schrøder
  • 494
  • 1
  • 4
  • 22
  • You can create Action Filter Attribute to handle dashes: http://stackoverflow.com/questions/3461365/using-a-dash-in-asp-mvc-parameters – Ihor Deyneka Jul 10 '14 at 21:07
  • The actionresult doesn't work in Web API? – Peter Schrøder Jul 10 '14 at 21:12
  • Does it matter what your method returns? ASAIK it is possible to use ActionFilterAttribute in Web Api. You can still add those attributes to your API actions. You can post your ApiController code. – Ihor Deyneka Jul 10 '14 at 21:17
  • how did you handle the multi part form data? the one that comes back from dropped messages – jplara Feb 01 '18 at 18:53

2 Answers2

6

One of the easiest ways is to receive a FormDataCollection and access the variables you need. It's lame because you have to map manually each property but it works for simple scenarios.

public IHttpActionResult AppointmentMessage(FormDataCollection data)
{
    if (data != null)
    {
        var msg = new MailGunMessage();
        msg.From = data["from"];
        msg.To = data["to"];
        msg.Subject = data["subject"];
        msg.BodyHtml = data["body-html"];
        msg.BodyPlain = data["body-pain"];
        // ... and so on
    }
    return this.Ok();
 }

An other options is to use a custom model binder on your model like described here: https://stackoverflow.com/a/4316327/1720615

Community
  • 1
  • 1
Chris
  • 2,009
  • 1
  • 16
  • 25
0

You can still use your model as the parameter for the action and just get the dashed values via Request.Params e.g. HttpContext.Current.Request.Params["device-type"].

That way you'll be able to work with your strongly typed model instead of a FormDataCollection.

BornToCode
  • 9,495
  • 9
  • 66
  • 83