我的控制器中有一个来自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,还有其他方法可以更改此参数值吗?
答案 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";
}
}
}