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; }
}
4
  • You can create Action Filter Attribute to handle dashes: stackoverflow.com/questions/3461365/… Commented Jul 10, 2014 at 21:07
  • The actionresult doesn't work in Web API? Commented Jul 10, 2014 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. Commented Jul 10, 2014 at 21:17
  • how did you handle the multi part form data? the one that comes back from dropped messages Commented Feb 1, 2018 at 18:53

2 Answers 2

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

Sign up to request clarification or add additional context in comments.

Comments

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.