2010-12-27 37 views
5

Để hỗ trợ ứng dụng kế thừa trong trường, tôi cần ứng dụng ASP.NET MVC của mình để trả về một phản hồi trống cũng có Content-Type. Một trong những IIS, ASP.NET, hoặc ASP.NET MVC đang loại bỏ Content-Type của tôi khi tôi gửi trả về một phản hồi null. Có cách nào để khắc phục điều này?Đặt kiểu nội dung của phản hồi trống trong ASP.NET MVC

(Mặc dù không đòi hỏi một phản hồi trống với một bộ Content-Type rõ ràng sẽ là giải pháp lý tưởng, các khách hàng đã ra khỏi đó, và nhiều trong số họ không thể nâng cấp.)

EDIT: Kể từ khi có một yêu cầu mã: Tôi đang ủy quyền yêu cầu từ ứng dụng web mới tới ứng dụng cũ mà khách hàng dựa vào. Để làm điều này, tôi có một lớp con của ActionResult, được gọi là LegacyResult, mà bạn có thể chỉ cần trả lại cho những phương pháp cần được xử lý bởi phần mềm cũ. Đây là phần có liên quan của mã của nó:

public override void ExecuteResult(ControllerContext context) 
    { 
     using (var legacyResponse = GetLegacyResponse(context)) 
     { 
      var clientResponse = context.HttpContext.Response; 
      clientResponse.Buffer = false; 
      clientResponse.ContentType = legacyResponse.ContentType; /* Yes, I checked that legacyResponse.ContentType is never string.IsNullOrEmpty */ 
      if (legacyResponse.ContentLength >= 0) clientResponse.AddHeader("Content-Length", legacyResponse.ContentLength.ToString()); 

      var legacyInput = legacyResponse.GetResponseStream(); 
      using (var clientOutput = clientResponse.OutputStream) 
      { 
       var rgb = new byte[32768]; 
       int cb; 
       while ((cb = legacyInput.Read(rgb, 0, rgb.Length)) > 0) 
       { 
        clientOutput.Write(rgb, 0, cb); 
       } 
       clientOutput.Flush(); 
      } 
     } 
    } 

Nếu legacyInput có dữ liệu, sau đó Content-Type được thiết lập một cách thích hợp. Nếu không, nó không phải. Tôi thực sự có thể kluge phụ trợ cũ để gửi một câu trả lời trống rỗng và không trống cho chính xác yêu cầu tương tự, và quan sát sự khác biệt trong Fiddler.

EDIT 2: Poking xung quanh với Reflector cho thấy rằng, nếu tiêu đề đã không được viết vào thời điểm HttpResponse.Flush được gọi, sau đó Flush viết ra các tiêu đề riêng của mình. Vấn đề là nó chỉ viết ra một tập con nhỏ của các tiêu đề. Một trong những cái còn thiếu là Content-Type. Vì vậy, có vẻ như, nếu tôi có thể buộc tiêu đề ra dòng, tôi có thể tránh được vấn đề này.

+0

Hiển thị mã của bạn, xin vui lòng. –

+0

Tôi tự hỏi nếu nó đang Flushing dòng sản phẩm nào? Điều gì sẽ xảy ra nếu bạn nhận xét mọi thứ sau khi đặt 'ContentType'? –

+0

Nhận xét mọi thứ sau khi 'ContentType' tạo ra không có sự khác biệt; hành vi là như nhau. Điều này kết thúc bởi vì 'Flush' vẫn được gọi, nhưng bởi những nơi khác trong ngăn xếp ASP.NET. (Nói cách khác, có vẻ như dòng đó có thể bị loại bỏ mà không bị ảnh hưởng xấu, nhưng làm như vậy cũng không thay đổi hành vi.) –

Trả lời

8

Bạn phải lừa phản ứng vào viết các tiêu đề, bởi sai nói nó có nội dung, sau đó suppressing it:

/// [inside the writing block] 
var didWrite = false; 
while ((cb = legacyInput.Read(rgb, 0, rgb.Length)) > 0) 
{ 
    didWrite = true; 
    clientOutput.Write(rgb, 0, cb); 
} 
if (!didWrite) 
{ 
    // The stream needs a non-zero content length to write the correct headers, but... 
    clientResponse.AddHeader("Content-Length", "1"); 
    // ...this actually writes a "Content-Length: 0" header with the other headers. 
    clientResponse.SuppressContent = true; 
} 
Các vấn đề liên quan