asp.net-web-api - ASP.NET WebHooks - 版本控制
问题描述
我想在我们的项目中使用Microsoft.AspNet.WebHooks.Receivers.Stripe库。但是我的WebApi启用了ApiVersion ( Microsoft.AspNet.WebApi.Versioning )。这以某种方式干扰了 WebHooks 默认 Url,即:
https://<host>/api/webhooks/incoming/<receiver>
我正在使用 AspNet 示例中的示例 StripeWebHookHandler。我尝试像这样将ApiVersion放在WebHookHandler上,但没有成功:
[ApiVersion("1")]
[RoutePrefix("api/v{version:apiVersion}/webhooks/incoming/stripe")]
public class StripeWebHookHandler : WebHookHandler
我猜这一定是一个常见问题,但是我还没有找到任何解决方案,无论如何:
1) 使用提供的StripeWebHookHandler对 webhook URL 进行版本控制。
2) 禁用此特定 URL 的版本控制(也尝试了[ApiVersionNeutral]属性)。
解决方案
实际上,我最终创建了自己的 Web API 控制器来处理 Stripe WebHook。如果有人感兴趣,他们可以重用这段改编自 Stripe 文档的代码,以适应我们的 Web API 控制器。
您需要获取官方的 .net Stripe nuget 包才能使用此代码。
[ApiVersion("1")]
[RoutePrefix("api/v{version:apiVersion}/webhook")]
public class WebHookController : BaseApiController
{
// You can find your endpoint's secret in your webhook settings
private readonly string StripeWebHookSecret;
public WebHookController()
{
StripeWebHookSecret = WebConfigurationManager.AppSettings["StripeWebHookSecret"];
// Set your secret key: remember to change this to your live secret key in production
// See your keys here: https://dashboard.stripe.com/account/apikeys
var stripeApiSecret = WebConfigurationManager.AppSettings["StripeApiSecret"];
StripeConfiguration.SetApiKey(stripeApiSecret);
}
[Route("stripe")]
[HttpPost]
public async Task<HttpResponseMessage> StripeWebHook()
{
var json = await Request.Content.ReadAsStringAsync();
try
{
var result = Request.Headers.TryGetValues("Stripe-Signature", out IEnumerable<string> headerValues);
if (!result)
return new HttpResponseMessage(HttpStatusCode.BadRequest);
var stripeEvent = StripeEventUtility.ConstructEvent(json, headerValues.FirstOrDefault(), StripeWebHookSecret);
推荐阅读
- dynamic - 来自任意表的动态 SELECT
- jenkins - Cloudbees Jenkins Bitbucket 分支源插件配置硬编码以使用云?
- c# - 如何请求用户输入(内联)
- c# - C# Windows 服务未执行某些代码
- java - Docker容器以java中的命令行开始
- python - 如何在记录 dictConfig 中配置 JsonFormatter?
- apache-spark - pyspark Dataframe 到分区的 Hive 表中
- java - 用文本替换内容控件
- mysql - 如何在laravel中检测内部服务器错误(500)
- ruby-on-rails - 在同一线程中使用辅助/自治事务