【发布时间】:2019-11-05 09:09:56
【问题描述】:
我有一个中间件来记录 web api 请求。下面是Startup.cs 中的Configuration 方法。如果app.UseMiddleware 出现在app.UseMvc 之前,则不会调用任何Web api 调用但是,如果app.UseMiddleware 出现在app.UseMvc 之后,则中间件不会执行任何操作(即记录请求)。
我提供了下面的代码。任何想法为什么app.UseMiddleware 会干扰asp.UseMvc?
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider services)
{
// global cors policy
app.UseCors(x => x
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseMiddleware<ApiLoggingMiddleware>();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
}
下面是中间件:
public async Task Invoke(HttpContext httpContext, IApiLogService apiLogService)
{
try
{
_apiLogService = apiLogService;
var request = httpContext.Request;
if (request.Path.StartsWithSegments(new PathString("/api")))
{
var stopWatch = Stopwatch.StartNew();
var requestTime = DateTime.UtcNow;
var requestBodyContent = await ReadRequestBody(request);
var originalBodyStream = httpContext.Response.Body;
await SafeLog(requestTime,
stopWatch.ElapsedMilliseconds,
200,//response.StatusCode,
request.Method,
request.Path,
request.QueryString.ToString(),
requestBodyContent
);
}
else
{
await _next(httpContext);
}
}
catch (Exception ex)
{
await _next(httpContext);
}
}
【问题讨论】:
-
@Miky 感谢您的评论。通过将
await _next(httpContext);放在else之外,问题就解决了
标签: c# asp.net asp.net-web-api middleware