2017-04-03 4 views
1

이미 주제에 관한 많은 기사를 읽었지만 해결책을 찾을 수 없습니다. 다른 솔루션이 작동하지 않으며 최신 버전이기 때문에이 질문을 중복으로 표시하지 마십시오.새로운 HttpWebRequest에서 현재 세션 공유하기

GridView (행당 하나의 버튼)가 포함 된 페이지가있는 웹 응용 프로그램이 있습니다. 단추는 HttpWebRequest (또는 WebClient, 동일 함)를 만들고 html을 가져옵니다.

하나의 쿠키 또는 모든 쿠키를 사용하여 시도했지만 성공하지 못했습니다.

String path = Request.Url.GetLeftPart(UriPartial.Authority) + VirtualPathUtility.ToAbsolute("~/"); 

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(path + "MyPage.aspx"); 
CookieContainer cookieContainer = new CookieContainer(); 

HttpCookie httpCookie = HttpContext.Current.Request.Cookies.Get("ASP.NET_SessionId"); 
if (httpCookie != null) 
{ 
     Cookie myCookie = new Cookie(); 

     // Convert between the System.Net.Cookie to a System.Web.HttpCookie... 
     myCookie.Domain = webRequest.RequestUri.Host; 
     myCookie.Expires = httpCookie.Expires; 
     myCookie.Name = httpCookie.Name; 
     myCookie.Path = httpCookie.Path; 
     myCookie.Secure = httpCookie.Secure; 
     myCookie.Value = httpCookie.Value; 

     cookieContainer.Add(myCookie); 
} 

webRequest.CookieContainer = cookieContainer; 

string responseHTML = string.Empty; 
using (HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse()) 
{ 
    using (Stream responseStream = response.GetResponseStream()) 
    { 
     using (StreamReader responseReader = new StreamReader(responseStream)) 
      { 
       responseHTML = responseReader.ReadToEnd(); 
      } 
     } 
} 

webRequest.GetResponse가 타임 아웃을 얻을 것이다 : 이 코드입니다. 문제는 도메인 (localhost)이라고 생각합니다. 가능하지 않지만 도메인이 없으며 web.config에서 가짜 도메인을 만들지 않습니다. 또한 나는 성공없이 가짜 도메인을 사용하여 시도했다. 다음 줄은 세션을 공유하지 않고 잘 작동

webRequest.CookieContainer = cookieContainer; 

없이

. 도메인을 설정해야합니다. 그렇지 않으면 상대 오류가 발생합니다.

답변

2

세션 액세스는 일련 번호이어야합니다. ASP.NET 세션을 사용하는 경우 스레딩 문제를 피하기 위해 HTTP 요청을 "직렬화"해야합니다. 둘 이상의 요청이 병렬로 처리되면 두 스레드가 동시에 세션 변수를 변경하거나 읽을 수있어 다양한 문제가 발생할 수 있습니다.

좋은 소식 : ASP.NET will serialize the requests for you, automatically. 동일한 ASP.NET_SessionId를 사용하여 두 번째 요청을 보내면 첫 번째 요청이 완료 될 때까지 기다립니다.

나쁜 소식 : 즉, 시도하고있는 것과 같은 메커니즘이 작동하지 않는다는 의미입니다. 웹 요청은 이미 진행중인 하나의 HTTP 요청 컨텍스트에서 실행됩니다. WebRequest를 통해 보내는 요청을 포함하여 완료 될 때까지 추가 HTTP 요청을 모두 차단합니다.

더 좋은 소식 : 페이지가 세션 데이터를 읽고 쓰지 않으면 두 스레드가 동시에 실행할 수 있도록 힌트를 지정할 수 있습니다. 두 페이지에이를 추가하십시오 (코드 뒤에있는 페이지와 코드가 액세스하려는 페이지) : ASP.NET 세션의 요구는 것을 인식하면

<% @Page EnableSessionState="ReadOnly" %> 

읽기 전용, 그것은 할 수 있습니다 동일한 세션 ID로 동시에 실행될 두 개의 읽기 전용 스레드.

페이지에서 읽기/쓰기 액세스가 필요한 경우 운이 없게됩니다.

대신 HttpServerUtility.Transfer을 사용하는 것이 좋습니다. 첫 번째 페이지의 역할이 변경됩니다. 두 번째 페이지에 대한 프록시 역할을하는 대신 두 번째 페이지로 제어 권한을 넘깁니다. 페이지를 직렬로 배치하여 병렬 처리와 관련된 문제를 피할 수 있습니다.

예 :

Server.Transfer("MyPage.aspx"); 
+0

니스 솔루션하지만 난 세션에서 작성해야합니다. 첫 번째 페이지 쓰기, 두 번째 읽기. 그렇지 않으면 나는 querystring을 사용했을 것이다. 프로그램이 너무 오래되어 일부 페이지를 수정하지 않으려 고합니다. 다른 아이디어? @John Wu – Emanuele

+1

예, [this] (https://msdn.microsoft.com/en-us/library/caxa892w(v=vs.110) .aspx). –

+0

내 코드는 어디에서? – Emanuele

관련 문제