ASP.. NET MVC 5 - JSON -(动态?)模型绑定- REST服务- Webhooks - Charge
本文关键字:REST 模型 绑定 服务 Charge Webhooks 动态 MVC NET JSON ASP | 更新日期: 2023-09-27 18:03:17
这应该很容易,但我卡住了。我已经建立了一个webhook的服务(ChargeBee),是成功发布我的网站JSON。这是我试图绑定的模型:
public class ChargeBeeWebhookModel
{
public string id { get; set; }
public string occurred_at { get; set; }
public string source { get; set; }
public string @object { get; set; }
public string content { get; set; }
public string event_type { get; set; }
public string webhook_status { get; set; }
}
所有内容都是绑定的,除了"content",它是空的。问题在于"内容"将根据触发的事件类型而改变。例如,对于"customer created"事件:
"customer": {
"id": "8avVGOkx8U1MX",
"first_name": "Benjamin",
"last_name": "Ross",
"email": "Benjamin@test.com",
"auto_collection": "on",
"created_at": 1317407411,
"object": "customer",
"card_status": "valid",
"payment_method": {
"object": "payment_method",
"type": "card",
"gateway": "chargebee",
"reference_id": "tok_KyVr8xPHl5BSx1",
"status": "valid"
},
"account_credits": 0
},
"card": {
"customer_id": "8avVGOkx8U1MX",
"status": "valid",
"gateway": "chargebee",
"iin": "411111",
"last4": "1111",
"card_type": "visa",
"expiry_month": 1,
"expiry_year": 2016,
"object": "card",
"masked_number": "************1111"
}
我只需要将这些复杂对象绑定到某种类型。绳子坏了。一旦它被绑定,我就可以很容易地检查它是否是我想要使用event_type属性处理的事件,并将其反序列化为适当的自定义类型。
我该怎么做?我觉得我错过了一些很简单的东西。据我所知,Chargebee不会让我为每种类型的事件使用不同的URL,这是我认为最有意义的。这是一个URL,我必须绑定许多可能的响应。
我需要一个自定义模型绑定器或其他东西吗?有更简单的方法吗?
也许有人可以做一个ChargeBee标签?
谢谢每一个人。
编辑:
按照请求,这是示例请求的样子:
Headers
POST HTTP/1.1
Host:********.ngrok.io //(obviously I commented this out)
Authorization: Basic cGF0cmlvdGN5YmVybmV0aWNzZHJvbmVtYXN0ZXI6c3VuZGV2aWxjb2NvYXJhZ2luZ2J1bGw=
Content-Type: application/json; charset=utf-8
User-Agent: ChargeBee
Body
{
"id": "ev_3Nl8ERLPElBCRU6",
"occurred_at": 1341167306,
"source": "admin_console",
"object": "event",
"content": {
"subscription": {
"id": "3Nl8ERLPElBCGl1",
"plan_id": "basic",
"plan_quantity": 1,
"status": "future",
"start_date": 1341772105,
"trial_start": 1341772105,
"trial_end": 1344450505,
"created_at": 1341167305,
"has_scheduled_changes": false,
"object": "subscription",
"addons": [{
"id": "data_usage",
"quantity": 1,
"object": "addon"
}],
"due_invoices_count": 0
},
"customer": {
"id": "3Nl8ERLPElBCGl1",
"first_name": "Benjamin",
"last_name": "Ross",
"email": "Benjamin@test.com",
"auto_collection": "on",
"created_at": 1341167305,
"object": "customer",
"card_status": "valid",
"payment_method": {
"object": "payment_method",
"type": "card",
"reference_id": "3Nl8ERLPElBCGl1",
"status": "valid"
}
}
},
"event_type": "subscription_created",
"webhook_status": "not_configured"
}
除非我弄错了,我只是认为模型绑定器不能处理这种情况。它需要预定义的类型,不能处理可变性或动态的东西,据我所知。如果我说错了,请纠正我。无论如何,稍后我将用一个完整的代码示例回答这个问题,但现在我已经抛弃了纯模型绑定方法,正在阅读Request。InputStream获取我需要的JSON数据。然后,根据event_type(模型绑定器没有问题),我将其反序列化为预定义类型。只是我从来没有真正需要手动从请求中选择一些东西;我一直使用模型绑定器
这是我想要实现的。请求。InputStream是可行的方法;我开始尝试手动做到这一点,但幸运的是,ChargeBee有一个官方的。net库(不像Mandrill)为我做这一切:
[HttpPost]
[BasicAuthentication(username: "x", password: "y", BasicRealm = "z")]
public HttpStatusCodeResult ChargeBeeWebhook()
{
if (ModelState.IsValid)
{
Event chargeBeeEvent = new Event(Request.InputStream);
EventTypeEnum? eventType = chargeBeeEvent.EventType;
Event.EventContent eventContent = chargeBeeEvent.Content;
if (eventType == EventTypeEnum.SubscriptionCreated)
{
Subscription subscription = eventContent.Subscription;
Customer customer = eventContent.Customer;
// more stuff
}
return new HttpStatusCodeResult(200);
}
else
{
return new HttpStatusCodeResult(400); // bad request
}
}
好的,下面应该可以工作。不要为内容传递Javascript对象,而是使用JSON。对对象进行字符串化,并将其结果设置为content。这样在你的控制器中,content的值将是一个字符串