그 가치는 무엇인지, 나는 기존 ASP.NET 웹 응용 프로그램으로 콘솔 응용 프로그램을 인증 할 수있었습니다. 브라우저가 요청한 것처럼 viewstate 정보가 포함 된 로그인 페이지에 대한 게시물 요청을 작성하여 로그인 페이지를 모방합니다.콘솔 응용 프로그램 및 시간 초과로 인한 ASP.NET 승인
그런 다음 CookieContainer에서 응답으로 보내진 쿠키를 잡습니다.
그런 다음 응용 프로그램은 동일한 페이지 (승인이 필요함)로 여러 요청을합니다. 페이지는 일부 작업을 수행하고 서버에 파일을 작성합니다.
내가 마주 치게되는 문제는 가짜 로그인 후에 처음 두 요청이 정상적으로 처리된다는 것입니다. 세 번째 요청은 결코 응답을받지 못합니다.
로그인하려면 : 아래는 내가 요청을 만들기 위해 사용하고 코드는
private static CookieContainer PerformLoginRequest()
{
string loginURL = "http://www.myDomain.com/mySite/login.aspx";
//Set up the request and give it a cookie container.
CookieContainer cookieJar = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(loginURL);
request.CookieContainer = cookieJar;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
//Grab the request body so we can put important information in it.
Stream requestBody = request.GetRequestStream();
string postData = "__VIEWSTATE=GIBBERISH&UserName=USERNAME&Password=PASSWORD%21&LoginButton.x=0&LoginButton.y=0";
//Throw the string into the body.
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte1 = encoding.GetBytes(postData);
requestBody.Write(byte1, 0, byte1.Length);
requestBody.Close();
//Get the response to the login request.
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string result = reader.ReadToEnd();
reader.Close();
return cookieJar;
}
은 페이지를 요청하려면 :
private static long RequestPage(string url)
{
//If we've already got a CookieContainer, then we've logged in already. Otherwise, log in.
if (cookieJar == null)
{
try
{
cookieJar = PerformLoginRequest();
}
catch
{
throw;
}
}
//Set up the request.
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.CookieContainer = cookieJar;
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
request.Timeout = timeout; //5 minutes.
WebResponse response = request.GetResponse();
return response.ContentLength;
}
cookieJar 및 시간 제한 변수는 응용 프로그램에 글로벌 있습니다.
어떤 이유일까요? 내가 피들러가 실행하는 응용 프로그램을 실행하면
업데이트 (2010-01-17는 동부 표준시 오후 3시 반은)
, 다 잘 통해 간다. 모든 요청은 예상대로 작동합니다.
IIS 로그 파일을 검사했습니다. 그들에게 초기 로그인 요청, 로그인 후 리다이렉트 및 처음 두 페이지에 대한 요청을 볼 수 있습니다. 하지만 그 후에 ... 아무것도. 그것은 요청이 웹 서버를 만들지 않는 것과 같습니다.
업데이트 (2010-01-18 11:29 AM EST)이란 크리스 B. 베렌스에 의해 제안 된 변경 사항을 반영하기 위해 상단까지의 코드를 업데이트
. 그러나 아무 소용이 없습니다. 이 중요한 경우, 위의 함수를 호출 루프는 다음과 같습니다
private static void RegenerateNecessaryForms(MyEntities context)
{
var items = context.Items.Where(i => i.NeedsProcessing == true);
var area = context.Areas;
foreach (Item i in items)
{
bool success = true;
foreach (Area area in areas)
{
try
{
string url = string.Format("http://{0}/mySite/process.aspx?item={1}&area={2}", targetDomain, i.ItemName, area.AreaName);
long result = RequestPage(url, m);
}
catch
{
success = false;
}
}
if (success)
{
i.NeedsProcessing = false;
}
}
}
업데이트 (2010-01-18은 동부 표준시 오후 1시 3분는) 이것은 아마 내가 것 중 가장 유용한 정보입니다 지금까지 제공 할 수있었습니다.
IIS 로그를 다시보고있었습니다. 로그인 요청이 전송되면 로그를 플러시하여 즉시 표시 할 수 있습니다. 그러나 콘솔 응용 프로그램을 닫을 때까지 페이지 요청이 표시되지 않습니다. 다음은 로그의 관련 비트입니다.
2011-01-18 17:44:54 X.X.X.X POST /MySite/login.aspx - 80 - X.X.X.X - 302 0 0 148
2011-01-18 17:44:54 X.X.X.X GET /MySite/default.aspx - 80 AutomatedUser X.X.X.X - 200 0 0 48
2011-01-18 17:54:33 X.X.X.X GET /MySite/process.aspx model=ITEM_ONE&area=US 80 AutomatedUser X.X.X.X - 200 0 995 579100
2011-01-18 17:54:33 X.X.X.X GET /MySite/process.aspx model=ITEM_ONE&area=CANADA 80 AutomatedUser X.X.X.X - 200 0 995 553247
2011-01-18 17:54:33 X.X.X.X GET /MySite/process.aspx model=ITEM_TWO&area=US 80 AutomatedUser X.X.X.X - 200 0 995 532824
각 GET 요청 process.aspx는 위의 RequestPage 메소드에 대한 호출에 해당합니다. 줄 "request.GetResponse();" 단지 약 10 초 정도 걸리지 만 응용 프로그램을 닫을 때까지 요청이 완료되지 않는 것처럼 보입니다 (최소한 IIS에 따라). (각 줄의 마지막 숫자를 살펴보면, 페이지를 서비스하는 데 걸린 시간 (밀리 초)을 보았습니다.하지만 응답 시간은 어플리케이션에서 훨씬 짧습니다.) 가능합니다.) IIS는 하나의 IP로부터 받아 들일 연결의 양을 제한합니다.
다음과 같은 질문에 대한 질문이 나옵니다. 내가 만드는 요청으로 인해 그와 같은 "열린"상태가 유지되는 이유는 무엇입니까?
요청이 HTML 페이지를 반환하지 않습니다 (문제가있는 경우). 요청이 PDF를 반환합니다. 그 트릭을 않는 경우
//Get the response to the login request.
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string result = reader.ReadToEnd();
reader.Close();
return cookieJar;
참조 :
* 세 번째 요청시 항상 실패합니까? 페이지 또는 특정 페이지에 오류가 발생합니까? ASP.NET 측에서 디버그/로그 할 수 있습니까? –
네, 세 번째 요청이 항상 있습니다. 나는 Fiddler를 열었고 응용 프로그램을 실행했고 모든 것이 잘되었습니다. 내 이해가 정확하다면, Fiddler는 프록시 역할을하므로 본질적으로 내 요청이 웹 브라우저에서 오는 것처럼 보입니다. 아마도 서버가 앱에서 온 어떤 이유로 앱을 거부하고있는 것입니까? IIS 로그 파일을 살펴보고 내가 무엇을 생각해 낼 수 있는지 알아 보겠습니다. 그동안 도움에 감사드립니다! –
"okay"가 정확히 무엇을 의미합니까? 인증 토큰 쿠키로 응답하는지, 아니면 단지 200 개 또는 무엇으로 응답 하는지를 의미합니까? –