Выровненный HttpRequest теряет QueryString

Мне нужно проверить класс-помощник, который управляет сложной цепочкой.

Я использую этот вспомогательный метод, чтобы издеваться над HttpContext:

public static HttpContext FakeHttpContext(string url, string queryString)
{
    var httpRequest = new HttpRequest("", url, queryString);
    var stringWriter = new StringWriter();
    var httpResponse = new HttpResponse(stringWriter);
    var httpContext = new HttpContext(httpRequest, httpResponse);

    var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
                                            new HttpStaticObjectsCollection(), 10, true,
                                            HttpCookieMode.AutoDetect,
                                            SessionStateMode.InProc, false);
    SessionStateUtility.AddHttpSessionStateToContext(httpContext, sessionContainer);

    return httpContext;
}

Проблема в том, что HttpRequest теряет запрос:

HttpContext.Current = MockHelpers.FakeHttpContext("http://www.google.com/", "name=gdfgd");

HttpContext.Current.Request.Url "http://www.google.com/", а не "http://www.google.com/?name=gdfgd", как ожидалось.

Если я отлаживаю, я вижу, что сразу после контура HttpRequest строка запроса теряется.

Обходной путь, который я использую, - передать URL-адрес с помощью querystring в конструктор HttpRequest:

HttpContext.Current = MockHelpers.FakeHttpContext("http://www.google.com/?name=gdfgd","");

Ответ 1

Благодаря комментарий в Галварде У меня была подсказка, чтобы найти ответ:

Параметры конструктора HttpRequest отключены между ними.

Параметр url используется для создания HttpRequest.Url, а свойство queryString используется для свойства HttpRequest.QueryString: они отсоединены

Чтобы иметь согласованное HttpRequest с URL-адресом с querystring, вы должны:

var httpRequest = new HttpRequest
      ("", "http://www.google.com/?name=gdfgd", "name=gdfgd");

В противном случае вы неправильно загрузите свойство Url или QueryString.

Есть мой обновленный метод Mock Helpers:

public static HttpContext FakeHttpContext(string url)
{
    var uri = new Uri(url);
    var httpRequest = new HttpRequest(string.Empty, uri.ToString(), uri.Query.TrimStart('?'));
    var stringWriter = new StringWriter();
    var httpResponse = new HttpResponse(stringWriter);
    var httpContext = new HttpContext(httpRequest, httpResponse);

    var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
                                            new HttpStaticObjectsCollection(), 10, true,
                                            HttpCookieMode.AutoDetect,
                                            SessionStateMode.InProc, false);
    SessionStateUtility.AddHttpSessionStateToContext(httpContext, sessionContainer);

    return httpContext;
}

Ответ 2

Попробуйте следующее:

Uri uriFull = new Uri(HttpContext.Current.Request.Url, HttpContext.Current.Request.RawUrl);