Why does adding a newline to StatusDescription in ASP.Net close the connection?

When I return a StatusDescription with a newline using the HttpStatusCodeResult from ASP.Net MVC 3.0, the connection to my client is forcibly closed. App is hosted in IIS 7.0.

Example controller:

 public class FooController : Controller
 {
    public ActionResult MyAction()
    {
       return new HttpStatusCodeResult((int)HttpStatusCode.BadRequest, "Foo n Bar");
    }
 }

Example client:

using (WebClient client = new WebClient())
{
   client.DownloadString("http://localhost/app/Foo/MyAction");
}

Thrown Exception:

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

The behavior is consistent when using curl (curl 7.25.0 (i386-pc-win32) libcurl/7.25.0 zlib/1.2.6)

curl http://localhost/app/Foo/MyAction

curl: (56) Recv failure: Connection was reset

Edit

I ended up using this custom ActionResult to get the desired results.

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

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

You can’t have a linebreak in the middle of an HTTP header.

The HTTP protocol specifies the end of a header is a line break.

Since the line break is in the middle of a header, the header is not a valid header and you are getting this error.

Fix: Don’t put a line break in the middle of an HTTP header.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x