我正在做一个旧项目。一些客户可以在其中看到别名的产品名称。其他人将看到实际的产品名称。当客户请求产品详细信息时,他/她将在QueryString中发送产品名称。我必须使用public override void OnActionExecuting
方法检查它是否是实际的产品名称。
如果这不是实际的产品名称,我将不得不使用实际的产品名称创建一个新请求,因为我无法更改请求的queryString。控制器将产品名称值作为HttpContext.Current.Request.QueryString["Product"] ?? string.Empty;
如何使用OnActionExecuting中更新的查询字符串创建新请求?
public override void OnActionExecuting(HttpActionContext actionContext)
{
var token = actionContext.Request.RequestUri.ParseQueryString();
var flag = false;
if (token != null)
{
var key = token.AllKeys.Where(x => x.ToLower().Equals("productname"))?.FirstOrDefault();
if(aliasedProduct(token[key]))
{
token[key] = RevertAlias(token[key]);
flag = true;
ConstructQueryString(token);
}
}
if(flag)
{
//Here Have to create new Call as QueryString Can not be changed.
}
}
public string ConstructQueryString(NameValueCollection parameters)
{
List<string> items = new List<string>();
foreach (string key in parameters)
items.Add (key.ToString() + "=" + parameters[key].ToString());
return string.Join("&", items.ToArray());
}
这是我的控制器方法:
[Route("ProductDetail")]
public HttpResponseMessage getProductDetail()
{
HttpResponseMessage response;
try
{
string product= HttpContext.Current.Request.QueryString["Product"] ?? string.Empty;
//Here are others variable and logic
var productDetails = productManagement.GetProductDetail(this.GetCurrentContextUser(), product);
response = Request.CreateResponse(HttpStatusCode.OK, productDetails);
return response;
}
catch (InputValidationException ex)
{
Helper.AddModelErrors(ModelState, ex);
response = Request.CreateErrorResponse(HttpStatusCode.NotFound, ModelState);
}
catch (System.Exception ex)
{
response = Request.CreateResponse(HttpStatusCode.InternalServerError, ex);
}
return response;
}
我无法更改控制器的方法结构。如果我更改了其他许多客户端产品,则需要更新。我有什么办法可以在 OnActionExecuting
中做到这一点