C# Web api调用上的ActionFilterAttribute未正确重定向到新位置

C# Web api调用上的ActionFilterAttribute未正确重定向到新位置,c#,actionfilterattribute,C#,Actionfilterattribute,“我的操作筛选器”属性不会重定向到我定义的新url: public class RunOnServerAttribute : System.Web.Http.Filters.ActionFilterAttribute { public ServerType Type; public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext) {

“我的操作筛选器”属性不会重定向到我定义的新url:

public class RunOnServerAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public ServerType Type;

    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext)
    {
        switch (Type)
        {
            case ServerType.CMS:
                if (!filterContext.Request.RequestUri.AbsoluteUri.StartsWith(Config.CMSUrl))
                {
                    Uri correctedUri = new Uri($"{Config.CMSUrl.TrimEnd('/')}/{filterContext.Request.RequestUri.PathAndQuery.TrimStart('/')}");
                    var response = filterContext.Request.CreateResponse(System.Net.HttpStatusCode.Moved);
                    response.Headers.Location = correctedUri;
                    return;
                    // This does not seem to work
                }

                break;
        }

        base.OnActionExecuting(filterContext);
    }
}

它只是继续正常的请求。我通过检查正在执行的api方法中的Request.RequestUri来调试此操作,该方法在控制器操作方法调用之前调用了ActionExecuting,因此在运行筛选器方法之后,控制器操作将替换响应。我认为方法
OnActionExecuted
更适合您的代码。

OnActionExecuting
在控制器操作方法调用之前被调用,所以在运行过滤器方法之后,控制器操作将替换响应。我认为方法
OnActionExecuted
更适合您的代码。

很抱歉没有注意到这是一个WebAPI项目。 撰写响应应该是一个快速的解决方案

var res = actionContext.Request.CreateResponse(HttpStatusCode.Redirect);
res.Headers.Location = new Uri("https://www.google.com");
actionContext.Response = res;
-------------以上更新--------------

您应该使用filterContext.Result并分配ActionResult。就像你在正常行动中所做的一样。 比如说,

var controller = (YourBaseControllerType)filterContext.Controller;
filterContext.Result = controller.RedirectToAction("actionName", "controllerName");


很抱歉没有注意到这是一个WebAPI项目。 撰写响应应该是一个快速的解决方案

var res = actionContext.Request.CreateResponse(HttpStatusCode.Redirect);
res.Headers.Location = new Uri("https://www.google.com");
actionContext.Response = res;
-------------以上更新--------------

您应该使用filterContext.Result并分配ActionResult。就像你在正常行动中所做的一样。 比如说,

var controller = (YourBaseControllerType)filterContext.Controller;
filterContext.Result = controller.RedirectToAction("actionName", "controllerName");


如果在设置响应后返回API请求,则此选项不可用。或者我应该继续通过base.OnActionExecuting运行filtercontext吗?这取决于您的需求。但是如果你只是想重定向,那么不调用基就可以了。这对于API请求不可用。我应该在设置响应后返回。或者我应该继续通过base.OnActionExecuting运行filtercontext吗?这取决于您的需求。但是,如果您只是想重定向,那么不调用base是可以的。执行意味着它已经在控制器中针对错误的api url运行了代码。您是否需要将更正的url返回给客户端,但是在应用程序中调用另一个控制器操作?执行的操作意味着它已经针对错误的api url运行了控制器中的代码。您是否不需要将更正的url返回给客户端,而是在应用程序中调用另一个控制器操作?