Estoy escribiendo una prueba unitaria para un servicio web WCF. Estoy enviando deliberadamente una solicitud no válida al servidor que arroja un WebExceptionFault<string>
. En la prueba unitaria, la excepción que queda atrapada es EndpointNotFoundException
con el estándar WebException
en la propiedad InnerException
. Quiero verificar que el cuerpo de la respuesta coincida con la cadena que creo que debería estar allí.Las propiedades de la excepción interna están expuestas?
Estoy llegando a un problema, sin embargo, como la propiedad Response
de (que es System.Net.SyncMemoryStream
) está Dispuesta y no se puede leer.
Mi código:
Clubs actual;
try
{
//"201" is an invalid argument for the first parameter
actual = new Clubs(channel.GetClubs("201", "123"));
}
catch (EndpointNotFoundException e)
{
WebException w = e.InnerException as WebException;
Assert.IsNotNull(w);
HttpWebResponse resp = w.Response as HttpWebResponse;
Assert.IsNotNull(resp);
Assert.AreEqual(resp.StatusCode, HttpStatusCode.NotFound);
//Next line throws an ArgumentException saying Stream not readable
//Investigation shows it has been disposed
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
Assert.AreEqual(sr.ReadToEnd(), "League not allowed for selected club");
}
¿Es normal que las propiedades de la InnerException están dispuestos? ¿Hay alguna forma de evitar esto?
Eso es de esperar. System.Net no va a suponer que quien atrape la excepción va a tomarse la molestia de desenterrar el flujo de respuesta y deshacerse de él. Por lo tanto, se limpia antes de tirar. No puedes cambiar este comportamiento. –
Seguramente no debería poder acceder al flujo de respuesta si la conexión subyacente está cerrada ¿no? En ese punto, casi seguramente lo habrá cerrado cuando empiece a procesar la excepción 'EndPointNotFoundException'. Creo que debería comenzar a procesar la excepción, ya que está capturada leyendo en la secuencia de respuesta de inmediato y terminando así. –
@Jeff: ¿Cuándo se cierra la conexión subyacente en el ejemplo anterior? El primer punto que puedo ver para leer la secuencia de respuesta es después de obtener el 'HttpWebResponse'. ¿Es eso a lo que te refieres? – Clivest