如何在OnActionExecuting中使用更新的QueryString值创建新请求?

时间:2018-09-18 16:45:24

标签: asp.net-mvc httprequest query-string

我正在做一个旧项目。一些客户可以在其中看到别名的产品名称。其他人将看到实际的产品名称。当客户请求产品详细信息时,他/她将在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("&amp;", 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

中做到这一点

0 个答案:

没有答案