Как создать новый запрос с обновленным значением QueryString в OnActionExecuting? - PullRequest
0 голосов
/ 18 сентября 2018

Я работаю над старым проектом.Где какой-то клиент может увидеть псевдоним продукта.Другие увидят фактическое название продукта.Когда клиент запрашивает информацию о продукте, он отправляет имя продукта в 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

...