越來越routetemplate值我有一個名爲的每個請求我的API中間件。我想記錄路線模板以及來自這個中間件的請求的持續時間。如何在我的中間件代碼中獲得路由模板?路線模板類似於「/ products/{productId}」。ASP.Net核心 - 從中間件
0
A
回答
2
這並不容易,因爲它是由MVC中間件通常恰好是在ASP.NET核心管線要執行的最後中間件創建從自定義中間件獲得路由數據。
如果你想登錄爲下方的中間件的請求和響應,
public async Task Invoke(HttpContext context)
{
var requestBodyStream = new MemoryStream();
var originalRequestBody = context.Request.Body;
await context.Request.Body.CopyToAsync(requestBodyStream);
requestBodyStream.Seek(0, SeekOrigin.Begin);
var url = UriHelper.GetDisplayUrl(context.Request);
var requestBodyText = new StreamReader(requestBodyStream).ReadToEnd();
_logger.Log(LogLevel.Information, 1, $"REQUEST METHOD: {context.Request.Method}, REQUEST BODY: {requestBodyText}, REQUEST URL: {url}", null, _defaultFormatter);
requestBodyStream.Seek(0, SeekOrigin.Begin);
context.Request.Body = requestBodyStream;
await next(context);
var bodyStream = context.Response.Body;
var responseBodyStream = new MemoryStream();
context.Response.Body = responseBodyStream;
await _next(context);
responseBodyStream.Seek(0, SeekOrigin.Begin);
var responseBody = new StreamReader(responseBodyStream).ReadToEnd();
_logger.Log(LogLevel.Information, 1, $"RESPONSE LOG: {responseBody}", null, _defaultFormatter);
responseBodyStream.Seek(0, SeekOrigin.Begin);
await responseBodyStream.CopyToAsync(bodyStream);
}
但是,如果你是在路由數據真正感興趣,有非常漂亮的SO回答來實現獲取路線miidleware here
其它可供選擇的方法是使用爲Action Filters請求/響應日誌記錄。
0
這是我如何得到它的工作。我在我的過濾器OnActionExecuting方法中獲取路由模板並將其添加到HttpContext。後來,我從中間件內部的HttpContext訪問它,因爲我可以在中間件內部訪問HttpContext。
public class LogActionFilter : IActionFilter
{
public LogActionFilter()
{
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
public void OnActionExecuting(ActionExecutingContext context)
{
context.HttpContext.Items.Add("RouteTemplate", context.ActionDescriptor.AttributeRouteInfo.Template);
}
}
相關問題
- 1. ASP.NET核心OWIN中間件
- 2. ASP.NET 2.0的核心中間件認證
- 3. ASP.NET核心 - MVC上的中間件
- 4. asp.net核心中間件vs過濾器
- 5. asp.net核心排除從構建文件
- 6. 從asp.net核心有效發送文件
- 7. 與ASP.Net核心
- 8. asp.net核心1.0 mvc。從Request.Body
- 9. ASP.NET核心0x80004005
- 10. asp.net核心認證
- 11. 在Asp.net核心
- 12. 在Asp.net核心
- 13. ASP.Net核心maxUrlLength
- 14. ASP.NET核心刪除DNX核心5.0
- 15. 在asp.net核心
- 16. asp.net核心defaultProxy
- 17. Structuremap和ASP.NET核心
- 18. 遷移從asp.net到asp.net核心
- 19. Asp.NET核心OpenIddict invalid_grant
- 20. 是什麼創建項目ASP.NET核心(核心.NET)和ASP.NET核心(.NET Framework)的
- 21. ASP.Net核心:C#中的URL重寫中間件#
- 22. Map和MapWhen在asp.net核心中間件中的區別?
- 23. Asp.Net核心(完整.Net框架)與Asp.Net核心(.Net核心)性能
- 24. ASP.NET核心和CreateErrorResponse
- 25. ASP.NET核心 - JwtBearer 2.0.0
- 26. ELMAH for asp.net核心
- 27. ASP.NET核心URL重寫
- 28. ASP.NET核心權限
- 29. ASP.NET核心 - Git中的Bower文件
- 30. Asp.Net核心長時間運行任務
你的代碼示例記錄了實際的請求url。我想記錄路線模板。而不是/ products/product123我想記錄/ products/{productId}。不過,我可以使用動作過濾器來獲得此功能。感謝那些信息。 – sathya