C# Web api调用上的ActionFilterAttribute未正确重定向到新位置
“我的操作筛选器”属性不会重定向到我定义的新url: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) {
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返回给客户端,而是在应用程序中调用另一个控制器操作?