2010-09-21 37 views
10

Tôi đang thêm tiêu đề vào một trang như sau: Page.Response.AddHeader ("foo", "bar");Phát hiện rằng tiêu đề http asp.net đã gửi

Tùy thuộc vào quá trình xử lý trước đó, đôi khi điều này không thành công với "Máy chủ không thể nối tiêu đề sau khi tiêu đề HTTP đã được gửi". Tôi đang giải quyết vấn đề này bằng cách đính kèm Page.Response.AddHeader ("foo", "bar"); trong một cấu trúc cố gắng. Tuy nhiên, để giữ cho mọi thứ sạch hơn và tránh tạo ra một ngoại lệ là có bất kỳ cách nào để phát hiện rằng các tiêu đề đã được gửi đi? (Btw nếu tôi cố gắng đánh giá Page.Response.Headers sau đó tôi nhận được lỗi sau: "Hoạt động này đòi hỏi phải có tích hợp IIS chế độ đường ống")

Cảm ơn

+0

Để sử dụng bộ nhớ đệm Page.Response.Cache – gandjustas

+0

Tôi đã thấy điều này trước đây. Bạn cần phải giải thích những công nghệ bạn đang sử dụng: bộ nhớ đệm, AJAX, MVC, ... và vị trí trong mã bạn đang thêm tiêu đề này để chúng tôi có thể trợ giúp. – Aliostad

Trả lời

6

Thật không may, trong khi các đối tượng HttpResponse có một tính chất gọi HeadersWritten, và một lĩnh vực ủng hộ gọi _headersWritten, không ai trong số những có thể truy cập từ bên ngoài lắp ráp System.Web - trừ khi bạn sử dụng Reflection. Tôi không rõ những gì bạn nghĩ rằng bạn sẽ có thể nhận được từ bộ sưu tập Tiêu đề, nó có thể hoặc không tồn tại, độc lập với việc các tiêu đề đã được gửi chưa.

Nếu bạn muốn sử dụng Phản ánh, nó có thể có hình phạt hiệu suất của riêng nó và điều đó sẽ yêu cầu ứng dụng của bạn chạy hoàn toàn tin cậy.

Tất cả các phương thức truy cập công khai trên HttpResponse có liên quan đến trường _headersWritten dường như sử dụng nó để ném ngoại lệ.

+0

+1 quan sát tốt. Công việc tôi nghĩ là công việc tôi đề xuất. – Aliostad

+0

Trong thời gian chờ đợi [.Net đã tạo HeadersWritten công khai kể từ Khung 4.5.2] (https://stackoverflow.com/a/36206613/2418006) – OneManBand

0

Đang cố gắng thiết lập bộ đệm false:

http://msdn.microsoft.com/en-us/library/950xf363.aspx

Điều này sẽ làm giảm bớt vấn đề đầu tiên của bạn nhưng sự thỏa mãn và trải nghiệm người dùng của bạn có thể bị ảnh hưởng. Ngoài ra "Hoạt động này yêu cầu chế độ đường ống tích hợp IIS" có liên quan đến xử lý máy chủ không phải IIS 7 dòng mã. Bạn có thể tìm thêm thông tin về nó ở đây:

http://forums.asp.net/p/1253457/2323117.aspx

13

Bạn có thể sử dụng HttpModule để đăng ký sự kiện PreSendRequestHeaders. Khi nó được gọi, viết một giá trị cho HttpContext.Current.Items chỉ ra rằng các tiêu đề đang được gửi đi - và sau đó ở khắp mọi nơi khác trong mã của bạn, bạn kiểm tra giá trị trong HttpContext.Current.Items để xem nếu nó được gửi chưa.

+0

Dường như điều này có thể đã giải quyết được cùng một vấn đề mà chúng tôi đang gặp phải. Cảm ơn! – anthonyv

+2

Nếu bạn có thể chuyển sang .NET 4.5.2, bạn nên sử dụng 'HttpResponseBase.AddOnSendingHeaders' để thay thế. [link] (http://msdn.microsoft.com/en-us/library/system.web.httpresponsebase.addonsendingheaders.aspx) – drphrozen

6

Tính NET 4.5.2, bạn có thể làm điều này bằng cách sử dụng tại công HeadersWritten tài sản của HttpResponse (xem the msdn docs):

if (HttpContext.Current.Response.HeadersWritten) { ... } 
0

Tôi đã sử dụng HttpContext.Current.Response.Headers. Đếm, khi được gửi Tổng số tiêu đề tăng; bạn chỉ có thể áp dụng Tuyên bố nếu cần.

Các vấn đề liên quan