Cuando devuelvo un StatusDescription con una nueva línea usando HttpStatusCodeResult de ASP.Net MVC 3.0, la conexión con mi cliente se cierra forzosamente. La aplicación se aloja en IIS 7.0.¿Por qué agregar una nueva línea a StatusDescription en ASP.Net cierra la conexión?
controladorEjemplo:
public class FooController : Controller
{
public ActionResult MyAction()
{
return new HttpStatusCodeResult((int)HttpStatusCode.BadRequest, "Foo \n Bar");
}
}
cliente Ejemplo:
using (WebClient client = new WebClient())
{
client.DownloadString("http://localhost/app/Foo/MyAction");
}
excepción lanzada:
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive.
System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
El comportamiento es consistente cuando se utiliza enrollamiento (enrollamiento 7.25.0 (i386-pc -win32) libcurl/7.25.0 zlib/1.2.6)
curl http://localhost/app/Foo/MyAction
rizo: (56) Recv fracaso: la conexión se restablece
Editar
Terminé usando este ActionResult personalizada para obtener los resultados deseados.
public class BadRequestResult : ActionResult
{
private const int BadRequestCode = (int)HttpStatusCode.BadRequest;
private int count = 0;
public BadRequestResult(string errors)
: this(errors, "")
{
}
public BadRequestResult(string format, params object[] args)
{
if (String.IsNullOrEmpty(format))
{
throw new ArgumentException("format");
}
Errors = String.Format(format, args);
count = Errors.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Length;
}
public string Errors { get; private set; }
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
HttpResponseBase response = context.HttpContext.Response;
response.TrySkipIisCustomErrors = true;
response.StatusCode = BadRequestCode;
response.StatusDescription = String.Format("Bad Request {0} Error(s)", count);
response.Write(Errors);
response.End();
}
}
excelente respuesta sucinta. – JJS