ASP.NET中间件调用另一个操作

amrnrhlw  于 2023-02-17  发布在  .NET
关注(0)|答案(1)|浏览(98)

在ASP.NET6WebAPI项目中,我编写了一个测试动作调用的中间件。

public class RequestResponseMiddleware
{
    private RequestDelegate _next;

    public RequestResponseMiddleware(RequestDelegate next)
    {
        this._next = next;
    }

    public async Task Invoke(HttpContext context)
    {
            // need server side url rewrite
            if (context.Request.Path.HasValue && context.Request.Path == "/weatherforecast/Test") 
            {
                context.Request.Path = PathString.FromUriComponent("/weatherforecast/User");

                context.SetEndpoint(endpoint: null);
                var routeValuesFeature = context.Features.Get<IRouteValuesFeature>();
                if (routeValuesFeature is not null)
                {
                     routeValuesFeature.RouteValues = null!;
                }
            }

            await _next.Invoke(context);
     }
}

当客户端发布到https://localhost:7290/weatherforecast/Test时,我希望它将调用方法/weatherforecast/User"
当使用方法context.Response.Redirect时,方法/weatherforecast/User将被调用。但请求将导致另一个url重定向。
是否可以在服务器端直接调用/weatherforecast/User

  • ---更新---*

我已经下载了www.example.com的核心源代码,并检查了RewriteMiddleware代码,它接缝重置request.Path,喜欢asp.net core source code ,and checked out theRewriteMiddlewarecode, and it seams reset request.Path, likes

context.Request.Path = PathString.FromUriComponent("/weatherforecast/User");

     context.SetEndpoint(endpoint: null);
     var routeValuesFeature = context.Features.Get<IRouteValuesFeature>();
     if (routeValuesFeature is not null)
     {
         routeValuesFeature.RouteValues = null!;
     }

然后呼叫

_next.Invoke(context);

但是,它不起作用。

sxpgvts3

sxpgvts31#

在你的情况下,我认为你想使用网址重写而不是网址重定向,检查这个文档,以了解差异。所以你可以使用重写中间件来实现它。

var rewrite = new RewriteOptions()
               .AddRewrite("weatherforecast/Test", "weatherforecast/User", true);
app.UseRewriter(rewrite);

在上述中间件中,如果url中包含weatherforecast/Test,Project将直接在服务器端调用weatherforecast/User

相关问题