在delegatinghandler中更改web api控制器动作参数

时间:2014-03-21 09:46:27

标签: c# asp.net-mvc asp.net-web-api

我的控制器中有一个来自ApiController(MVC4 WebApi)的动作:

[HttpGet] 
public IEnumerable<SomeDto> GetData(string username)
{
    return dbReader.GetSomeDtosByUser(username);
}

我有一个SendAsync方法的委托处理程序:

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);
}

我可以看到请求uri已正确更新(当我调试GetData时),但GetData中的参数username始终与我更改之前的相同。

如果不是通过更改委托处理程序中的请求queryparams,还有其他方法可以更改此参数值吗?

1 个答案:

答案 0 :(得分:3)

我尝试了你的场景,它运行得很好......不确定其他地方是否有错误...你确定你添加了消息处理程序吗? : - )

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

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";
        }
    }
}