2011-03-31 10 views
3

C#에서 웹 응용 프로그램을 만들고 있습니다.HTTP 헤더를 보낸 후에 서버에서 쿠키를 수정할 수 없습니다.

내 페이지가로드되면 일부 데이터를 처리하기 위해 비동기 스레드가 실행됩니다. 이 과정의 일부는 쿠키 업데이트입니다.

HttpException: Server cannot modify cookies after HTTP headers have been sent.

나는 주위에 일하거나이 문제를 해결할 수있는 방법 : 나는

System.Web.HttpContext.Current.Response.Cookies.Add(cookie)에 의해 응답에 쿠키를 저장할 때 그러나, 나는 다음과 같은 예외를 얻을?

답변

4

매우 좋은 이유가없는 한 ASP.NET 요청에서 백그라운드 작업자 스레드를 회전 시켜서는 안됩니다. 궁극적으로 브라우저에 응답을 보내기 전에이 스레드가 작업을 마칠 때까지 기다려야합니다.

응답 스트림이 이미 부분적으로 기록 된 다음 스레드가 쿠키를 추가하려고하는 것처럼 들립니다.

내가 여기 당신의 전략을 재고하고 다음 지침의 읽기를 취할 것 :

Chapter 6 — Improving ASP.NET Performance - Threading Guidelines

그것은 날짜가 문서처럼 보이지만 원칙은 여전히 ​​서있다. 데이터 프로세서를 호출하는 이유는 데이터 처리기가 오래 실행되어 ASP.NET 작업자 스레드가 리소스를 차단하거나 사용하지 못하게하려는 경우 페이지를 Asynchronous page으로 변경하는 것이 좋습니다.

+0

"응답 스트림이 이미 부분적으로 기록 된 다음 스레드가 쿠키를 추가하려고합니다." - 맞아. 이것이 가능한가? – amateur

+0

@Niall - 가능합니다. 그러나 코드를 어떻게 구성하는지 정확하게 보지 않고 어디에서 추측하지 않을 것입니다. – Kev

+0

@ Niall - 내 업데이트를 참조하십시오. – Kev

0

preinit 또는 init에 있으면 어떻게됩니까? 이것이 도움이 될지 확실하지 않은 경우. http://msdn.microsoft.com/en-us/library/ms178472.aspx#lifecycle_events

+0

또한 페이지의 초기화 이벤트에서이 오류가 발생했습니다. 그러나 Page : Init는 Application 이전에 있습니다 : PreSendRequestHeaders (http://chiranjeevinooli.blogspot.co.at/2009/05/application-page-and-control-events-in.html 참조). 여기서 무엇이 잘못 될 수 있습니까? –

1

예, 쿠키는 http 응답의 일부이며 비동기 작업에서는 응답이 생성되어 브라우저로 전송 된 후에 아무 것도 변경할 수 없습니다.

비동기 작업 결과를 얻으려면 브라우저에서 ajax 루프를 작성하는 것이 좋습니다. 작업이 완료되면 아약스 응답으로 쿠키를 반환 할 수 있습니다.

+1

흥미 롭습니다 - 어떻게 설정 될 수 있는지에 대한 예제를 얻을 수 있습니까? – amateur

관련 문제