2012-08-11 10 views
8

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?

controlador

Ejemplo:

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(); 
    } 
} 

Respuesta

10

No puede haber un salto de línea en medio de un encabezado HTTP.

El protocolo HTTP especifica que el final de un encabezado es un salto de línea.

Dado que el salto de línea está en el medio de un encabezado, el encabezado no es un encabezado válido y se obtiene este error.

Solución: No coloque un salto de línea en el medio de un encabezado HTTP.

+0

excelente respuesta sucinta. – JJS

Cuestiones relacionadas