问题
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®ion=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×tamp=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; }
}
回答1:
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
回答2:
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.
来源:https://stackoverflow.com/questions/24686109/web-api-dash-in-variable-name-model-binder