使用 Azure 事件网格和 blob 存储
Working with Azure Event Grid and blob storage
我是 Azure 事件网格和 Webhooks 的新手。
如何将我的 .net mvc web api 应用程序绑定到 Microsoft Azure 事件网格?
简而言之,无论何时将新文件添加到 blob 存储,Azure 事件网格都应通知我的 Web api 应用程序。
我试过下面的文章但没有成功
https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-event-quickstart
您可以通过创建一个自定义终结点来完成此操作,该终结点将订阅从事件网格发布的事件。您引用的文档使用 Request Bin 作为订阅者。而是在您的 MVC 应用程序中创建一个 Web API 端点来接收通知。您必须支持验证请求才能让您拥有一个有效的订阅者,然后您就可以离开 运行。
示例:
public async Task<HttpResponseMessage> Post()
{
if (HttpContext.Request.Headers["aeg-event-type"].FirstOrDefault() == "SubscriptionValidation")
{
using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
{
var result = await reader.ReadToEndAsync();
var validationRequest = JsonConvert.DeserializeObject<GridEvent[]>(result);
var validationCode = validationRequest[0].Data["validationCode"];
var validationResponse = JsonConvert.SerializeObject(new {validationResponse = validationCode});
return new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(validationResponse)
};
}
}
// Handle normal blob event here
return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}
How can I bind my .net mvc web api application to Microsoft Azure Event Grid?
In short I want, whenever a new file is added to blob storage, Azure Event grid should notify my web api application.
我为此做了一个演示,它在我这边工作正常。您可以参考以下步骤:
1.Create 仅具有功能的演示 RestAPI 项目
public string Post([FromBody] object value) //Post
{
return $"value:{value}";
}
2.If 我们想要将 Azure 存储与 Azure 事件网格集成,我们需要在位置 West US2 或 [=35= 创建一个 blob storage account ]美国中西部。更多细节可以参考截图。
2.Create 存储帐户 键入事件订阅并绑定自定义 API 端点
3.Upload blob 到 blob 存储并从 Rest API 检查。
以下是您如何使用 Web API 处理它的最新示例。您还可以从此处查看和部署工作示例:https://github.com/dbarkol/azure-event-grid-viewer
[HttpPost]
public async Task<IActionResult> Post()
{
using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
{
var jsonContent = await reader.ReadToEndAsync();
// Check the event type.
// Return the validation code if it's
// a subscription validation request.
if (EventTypeSubcriptionValidation)
{
var gridEvent =
JsonConvert.DeserializeObject<List<GridEvent<Dictionary<string, string>>>>(jsonContent)
.First();
// Retrieve the validation code and echo back.
var validationCode = gridEvent.Data["validationCode"];
return new JsonResult(new{
validationResponse = validationCode
});
}
else if (EventTypeNotification)
{
// Do more here...
return Ok();
}
else
{
return BadRequest();
}
}
}
public class GridEvent<T> where T: class
{
public string Id { get; set;}
public string EventType { get; set;}
public string Subject {get; set;}
public DateTime EventTime { get; set; }
public T Data { get; set; }
public string Topic { get; set; }
}
您也可以使用 Microsoft.Azure.EventGrid nuget 包。
来自以下文章(归功于 gldraphael):https://gldraphael.com/blog/creating-an-azure-eventgrid-webhook-in-asp-net-core/
[Route("/api/webhooks"), AllowAnonymous]
public class WebhooksController : Controller
{
// POST: /api/webhooks/handle_ams_jobchanged
[HttpPost("handle_ams_jobchanged")] // <-- Must be an HTTP POST action
public IActionResult ProcessAMSEvent(
[FromBody]EventGridEvent[] ev, // 1. Bind the request
[FromServices]ILogger<WebhooksController> logger)
{
var amsEvent = ev.FirstOrDefault(); // TODO: handle all of them!
if(amsEvent == null) return BadRequest();
// 2. Check the eventType field
if (amsEvent.EventType == EventTypes.MediaJobStateChangeEvent)
{
// 3. Cast the data to the expected type
var data = (amsEvent.Data as JObject).ToObject<MediaJobStateChangeEventData>();
// TODO: do your thing; eg:
logger.LogInformation(JsonConvert.SerializeObject(data, Formatting.Indented));
}
// 4. Respond with a SubscriptionValidationResponse to complete the
// event subscription handshake.
if(amsEvent.EventType == EventTypes.EventGridSubscriptionValidationEvent)
{
var data = (amsEvent.Data as JObject).ToObject<SubscriptionValidationEventData>();
var response = new SubscriptionValidationResponse(data.ValidationCode);
return Ok(response);
}
return BadRequest();
}
}
我是 Azure 事件网格和 Webhooks 的新手。
如何将我的 .net mvc web api 应用程序绑定到 Microsoft Azure 事件网格?
简而言之,无论何时将新文件添加到 blob 存储,Azure 事件网格都应通知我的 Web api 应用程序。
我试过下面的文章但没有成功 https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-event-quickstart
您可以通过创建一个自定义终结点来完成此操作,该终结点将订阅从事件网格发布的事件。您引用的文档使用 Request Bin 作为订阅者。而是在您的 MVC 应用程序中创建一个 Web API 端点来接收通知。您必须支持验证请求才能让您拥有一个有效的订阅者,然后您就可以离开 运行。
示例:
public async Task<HttpResponseMessage> Post()
{
if (HttpContext.Request.Headers["aeg-event-type"].FirstOrDefault() == "SubscriptionValidation")
{
using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
{
var result = await reader.ReadToEndAsync();
var validationRequest = JsonConvert.DeserializeObject<GridEvent[]>(result);
var validationCode = validationRequest[0].Data["validationCode"];
var validationResponse = JsonConvert.SerializeObject(new {validationResponse = validationCode});
return new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent(validationResponse)
};
}
}
// Handle normal blob event here
return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}
How can I bind my .net mvc web api application to Microsoft Azure Event Grid? In short I want, whenever a new file is added to blob storage, Azure Event grid should notify my web api application.
我为此做了一个演示,它在我这边工作正常。您可以参考以下步骤:
1.Create 仅具有功能的演示 RestAPI 项目
public string Post([FromBody] object value) //Post
{
return $"value:{value}";
}
2.If 我们想要将 Azure 存储与 Azure 事件网格集成,我们需要在位置 West US2 或 [=35= 创建一个 blob storage account ]美国中西部。更多细节可以参考截图。
2.Create 存储帐户 键入事件订阅并绑定自定义 API 端点
3.Upload blob 到 blob 存储并从 Rest API 检查。
以下是您如何使用 Web API 处理它的最新示例。您还可以从此处查看和部署工作示例:https://github.com/dbarkol/azure-event-grid-viewer
[HttpPost]
public async Task<IActionResult> Post()
{
using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
{
var jsonContent = await reader.ReadToEndAsync();
// Check the event type.
// Return the validation code if it's
// a subscription validation request.
if (EventTypeSubcriptionValidation)
{
var gridEvent =
JsonConvert.DeserializeObject<List<GridEvent<Dictionary<string, string>>>>(jsonContent)
.First();
// Retrieve the validation code and echo back.
var validationCode = gridEvent.Data["validationCode"];
return new JsonResult(new{
validationResponse = validationCode
});
}
else if (EventTypeNotification)
{
// Do more here...
return Ok();
}
else
{
return BadRequest();
}
}
}
public class GridEvent<T> where T: class
{
public string Id { get; set;}
public string EventType { get; set;}
public string Subject {get; set;}
public DateTime EventTime { get; set; }
public T Data { get; set; }
public string Topic { get; set; }
}
您也可以使用 Microsoft.Azure.EventGrid nuget 包。
来自以下文章(归功于 gldraphael):https://gldraphael.com/blog/creating-an-azure-eventgrid-webhook-in-asp-net-core/
[Route("/api/webhooks"), AllowAnonymous]
public class WebhooksController : Controller
{
// POST: /api/webhooks/handle_ams_jobchanged
[HttpPost("handle_ams_jobchanged")] // <-- Must be an HTTP POST action
public IActionResult ProcessAMSEvent(
[FromBody]EventGridEvent[] ev, // 1. Bind the request
[FromServices]ILogger<WebhooksController> logger)
{
var amsEvent = ev.FirstOrDefault(); // TODO: handle all of them!
if(amsEvent == null) return BadRequest();
// 2. Check the eventType field
if (amsEvent.EventType == EventTypes.MediaJobStateChangeEvent)
{
// 3. Cast the data to the expected type
var data = (amsEvent.Data as JObject).ToObject<MediaJobStateChangeEventData>();
// TODO: do your thing; eg:
logger.LogInformation(JsonConvert.SerializeObject(data, Formatting.Indented));
}
// 4. Respond with a SubscriptionValidationResponse to complete the
// event subscription handshake.
if(amsEvent.EventType == EventTypes.EventGridSubscriptionValidationEvent)
{
var data = (amsEvent.Data as JObject).ToObject<SubscriptionValidationEventData>();
var response = new SubscriptionValidationResponse(data.ValidationCode);
return Ok(response);
}
return BadRequest();
}
}