【发布时间】:2015-06-15 15:02:48
【问题描述】:
我已经创建了一个这样的自定义 MessageHandler:
public class WebAPICustomMessageHandler : DelegatingHandler {
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
//Parse QueryString
NameValueCollection queryString = HttpUtility.ParseQueryString(request.RequestUri.Query);
if (queryString != null) {
//Find my token
String token = queryString.Get("qsVariable");
if (!String.IsNullOrWhiteSpace(token)) {
//Remove token so it doesn't impact future handlers / controllers / etc.
queryString.Remove("qsVariable");
request.RequestUri.Query = queryString.ToString(); //How can we modify the querystring? apparently it's readonly?
//Append token as custom header to the request
request.Headers.Add("token", new String[] { token });
}
}
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
return response;
}
}
看来我无法直接更改 QueryString,这有点奇怪,因为我认为 Web API 管道中自定义消息处理程序的全部目的是允许这种确切的事情。能够根据请求/响应发出前后操作,包括数据清理/注入等。
我已经知道我可以使用 OWIN 轻松地做我想做的事(正如我已经做过的那样),但现在我试图在没有 OWIN 的情况下做到这一点。我是否必须创建一个全新的 HttpRequestMessage 才能更改 QueryString?从外观上看,我必须构建一个新的 Uri,然后构建 HttpRequestMessage,然后从原始的每个部分复制。
这是唯一的方法吗?还是有更好的方法我只是不知道?
- 请注意,稍后管道中的其他例程已设置为使用在请求标头中找到的令牌,但如果请求来自提交到 iframe,则无法设置标头,这是进程所在的位置以上就到位了。令牌被添加到查询字符串中,然后转换为标头以防止对管道的其余部分进行更改。
【问题讨论】:
标签: c# query-string asp.net-web-api2