如何从中间件调用控制器方法,只允许从中间件调用该方法?

问题描述 投票:0回答:1

我有一个控制器,它具有2个功能和一个中间件。

我的中间件

try
{
    var request = httpContext.Request;
    if (/* some logic here */)
    {
        await _next(httpContext);

        // Some logic here
        var someReturnValue = someFunction();

        // Need to call the Controller Method here
        // call SaveStaging(someReturnValue);
    }
    else
    {
        await _next(httpContext);
    }
}
catch (Exception ex)
{
    await _next(httpContext);
}

在我的控制器中

[Authorize(AuthenticationSchemes = "APIKeyAuthentication")]
[LogAction]
[ApiController]
[Route("api/[controller]/[action]")]
public class MyController : ControllerBase
{
    private IHttpContextAccessor _accessor;

    public MyController(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }

    [HttpPost]
    public async Task<ActionResult<ServiceResult>> PostData([FromBody] DataObj request)
    {
        ServiceResult result = new ServiceResult();
        result.isSuccessful = true;
        return Ok(result);
    }

    public async Task SaveStaging(int logNumber)
    {

    }
}

因此,最初,用户将调用PostData端点。在此方法中,它将返回它接受用户发布的数据。然后,在中间件中,我需要做一些事情,最后,我想在Controller中调用SaveStaging方法。我希望此SaveStaging方法只能由中间件访问,并且不应由用户直接调用。

所以我的问题是:

  1. 如何从中间件调用此方法?
  2. 如何限制SaveStaging仅允许中间件访问?
c# asp.net-core-2.0
1个回答
0
投票

您应该考虑将SaveStaging包装到服务中,因为这似乎是一个跨领域的问题。除此之外,作为重构问题,实现分层体系结构可能是明智的。

由于这是.NET Core,所以我建议完全拥抱dependency injection并将服务注入您的中间件。

public interface IStagingService 
{
    Task Save(int logNumber);
}

public class MyController : ControllerBase
{
    private readonly IStagingService _service;
    private readonly IHttpContextAccessor _accessor;

    public MyController(IStagingService service, IHttpContextAccessor accessor)
    {
        _service = service ?? throw new ArgumentNullException(nameof(service));
        _accessor = accessor  ?? throw new ArgumentNullException(nameof(accessor));;
    }
    //....
}

public class MyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IStagingService _service;
    public RequestCultureMiddleware(RequestDelegate next, IStagingService service)
    {
        _next = next;
        _service = service ?? throw new ArgumentNullException(nameof(service));
    }

    public async Task InvokeAsync(HttpContext context)
    {
    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.