11

ASP.Net MVC 3.0 から HttpStatusCodeResult を使用して改行を含む StatusDescription を返すと、クライアントへの接続が強制的に閉じられます。アプリは IIS 7.0 でホストされています。

コントローラーの例:

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

クライアントの例:

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

スローされた例外:

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

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: 接続がリセットされました

編集

最終的に、このカスタム ActionResult を使用して目的の結果を取得しました。

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

1 に答える 1

15

HTTP ヘッダーの途中に改行を入れることはできません。

HTTP プロトコルは、ヘッダーの終わりが改行であることを指定します。

改行がヘッダーの途中にあるため、ヘッダーは有効なヘッダーではなく、このエラーが発生しています。

修正: HTTP ヘッダーの途中に改行を入れないでください。

于 2012-08-11T20:06:38.330 に答える