在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);
但是,它不起作用。
1条答案
按热度按时间sxpgvts31#
在你的情况下,我认为你想使用网址重写而不是网址重定向,检查这个文档,以了解差异。所以你可以使用重写中间件来实现它。
在上述中间件中,如果url中包含
weatherforecast/Test
,Project将直接在服务器端调用weatherforecast/User
。