C# 在delegatinghandler中更改webapi控制器操作参数

C# 在delegatinghandler中更改webapi控制器操作参数,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我的控制器中有一个源自ApicController(MVC4 WebApi)的操作: [HttpGet] 公共IEnumerable GetData(字符串用户名) { 返回dbReader.GetSomeDtosByUser(用户名); } 我有一个具有SendAsync方法的delegatinghandler,如下所示: protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage reque

我的控制器中有一个源自ApicController(MVC4 WebApi)的操作:

[HttpGet]
公共IEnumerable GetData(字符串用户名)
{
返回dbReader.GetSomeDtosByUser(用户名);
}
我有一个具有SendAsync方法的delegatinghandler,如下所示:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
    ModifyUserNameInRequestQueryParams(request);
    base.SendAsync(request, cancellationToken);
}

public void ModifyUserNameInRequestQueryParams(Request request)
{
    var nameValues = request.RequestUri.ParseQueryString();
    nameValues.Set("username", "someOtherUsername");
    var uriWithoutQuery = request.RequestUri.AbsoluteUri.Substring(0, request.RequestUri.AbsoluteUri.IndexOf(request.RequestUri.Query));
    request.RequestUri = new Uri(uriWithoutQuery + "?" + nameValues);
}
受保护的覆盖任务SendAsync(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)
{
修改用户名InRequestQueryParams(请求);
base.sendaync(请求、取消令牌);
}
public void ModifyUserNameInRequestQueryParams(请求)
{
var nameValues=request.RequestUri.ParseQueryString();
nameValues.Set(“用户名”、“其他用户名”);
var uriWithoutQuery=request.RequestUri.AbsoluteUri.Substring(0,request.RequestUri.AbsoluteUri.IndexOf(request.RequestUri.Query));
request.RequestUri=新Uri(uriWithoutQuery+“?”+nameValues);
}
我可以看到请求uri已正确更新(当我调试GetData时),但GetData中的参数username始终与我更改它之前相同


如果不是通过更改delegatinghandler中的RequestQueryParams,是否还有其他方法可以更改此参数值?

我尝试了您的方案,效果很好…不确定其他地方是否有错误…您确定添加了消息处理程序吗?:-)

另外,如果使用消息处理程序不是严格要求,那么您也可以执行以下操作:

public class ValuesController : ApiController
{
    [CustomActionFilter]
    public string GetAll(string username)
    {
        return username;
    }
}

public class CustomActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        object obj = null;
        if(actionContext.ActionArguments.TryGetValue("username", out obj))
        {
            string originalUserName = (string)obj;

            actionContext.ActionArguments["username"] = "modified-username";
        }
    }
}

谢谢你的回答。是的,我确信我正在添加它,因为其中的代码会在请求时被调用。我正在处理程序中进行令牌验证,并希望使用从令牌中获得的一些信息更改请求uri。
public class ValuesController : ApiController
{
    [CustomActionFilter]
    public string GetAll(string username)
    {
        return username;
    }
}

public class CustomActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        object obj = null;
        if(actionContext.ActionArguments.TryGetValue("username", out obj))
        {
            string originalUserName = (string)obj;

            actionContext.ActionArguments["username"] = "modified-username";
        }
    }
}