c# - net - Mocked HttpRequest pierde la QueryString
request querystring aspx (2)
Prueba esto:
Uri uriFull = new Uri(HttpContext.Current.Request.Url, HttpContext.Current.Request.RawUrl);
Necesito probar una clase auxiliar que administre la cadena de consulta compleja.
Yo uso este método de ayuda para simular el 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;
}
El problema es que HttpRequest
pierde la cadena de consulta:
HttpContext.Current = MockHelpers.FakeHttpContext("http://www.google.com/", "name=gdfgd");
HttpContext.Current.Request.Url
es "http://www.google.com/"
y no "http://www.google.com/?name=gdfgd"
como se esperaba.
Si depuro veo que justo después del constrict de HttpRequest se pierde la cadena de consulta.
La solución alternativa que estoy usando es pasar la url con querystring al constructor HttpRequest:
HttpContext.Current = MockHelpers.FakeHttpContext("http://www.google.com/?name=gdfgd","");
Gracias al comentario de Halvard, tuve la clave para encontrar la respuesta:
Los parámetros del constructor HttpRequest están desconectados entre ellos.
El parámetro url se usa para crear HttpRequest.Url
y queryString se usa para la propiedad HttpRequest.QueryString
: están separados
Para tener una HttpRequest coherente con una url con querystring tienes que:
var httpRequest = new HttpRequest
("", "http://www.google.com/?name=gdfgd", "name=gdfgd");
De lo contrario, tendrá la propiedad Url o QueryString no cargada correctamente.
Está mi método Mock Helpers actualizado:
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;
}