0

내 프로그램 중 하나에서 C++/CLI를 사용해야했지만 이전에는 사용하지 않았습니다. 그래서 그것은 나에게 몇 가지 문제점을 안겨 주었다. 이것은 기본적으로 로그인 페이지에 http 요청을 보내는 기능입니다. 첫 번째 사용자는 작동하지만 두 번째 사용자는 GetRequestStream()에서 실패합니다. 나는 이것에 대해 봤어, 그리고 대부분의 주제에 대한 삭제/처분했다. 나는 지금 그 일을하고 있다고 생각하니? 그래도 타임 아웃이 오기전에 20 초 정도 기다려야합니다 (Time-out excpetion). 이 문제를 해결할 수있는 방법이 없습니다.C++/CLI HttpWebRequest :: GetRequestStream()이 처음 실패한 후 오류가 발생했습니다.

bool GetAuthKey(std::string _username, std::string _pass, std::string& _key) 
{ 
System::String^username = gcnew String(_username.c_str()); 
System::String^pass = gcnew String(_pass.c_str()); 

System::Net::CookieContainer ^cookieContainer = gcnew System::Net::CookieContainer(); 

System::Net::HttpWebRequest ^first_request = safe_cast<System::Net::HttpWebRequest^>(System::Net::HttpWebRequest::Create("https://passport.nexoneu.com/login/")); 
first_request->CookieContainer = cookieContainer; 
first_request->Method = "GET"; 
first_request->KeepAlive = true; 
first_request->GetResponse(); 

System::Net::Cookie ^theme = gcnew System::Net::Cookie("theme", "NexonEU"); 
theme->Domain = ".nexoneu.com"; 
cookieContainer->Add(theme); 

/*ArrayWriter ^postData = gcnew ArrayWriter(); 
postData.WriteBytes(Encoding.UTF8.GetBytes("{\"account\":{\"userId\":\"" + username + "\",\"password\":\"")); 
postData.WriteBytes(pass);// changed 
postData.WriteBytes(Encoding.UTF8.GetBytes("\",\"accessedGame\":\"NexonEU\",\"captcha\":null,\"isSaveID\":true}}"));*/ 

String ^data = "{\"account\":{\"userId\":\"" + username + "\",\"password\":\"" + pass + "\",\"accessedGame\":\"NexonEU\",\"captcha\":null,\"isSaveID\":true}}"; 
array<Byte> ^buffer = Encoding::UTF8->GetBytes(data); 

System::Net::HttpWebRequest ^request = safe_cast<System::Net::HttpWebRequest^>(System::Net::HttpWebRequest::Create("https://passport.nexoneu.com/Service/Authentication.asmx/Login")); 
request->Method = "POST"; 
request->CookieContainer = cookieContainer; 
request->Date = DateTime::UtcNow; 
request->ServicePoint->Expect100Continue = false;// think ive to change this 

request->Accept = "application/json, text/javascript, */*; q=0.01"; 
request->KeepAlive = true; 
request->ContentLength = buffer->Length; 
request->ContentType = "application/json; charset=UTF-8"; 
request->Host = "passport.nexoneu.com"; 
request->Referer = "https://passport.nexoneu.com/login/"; 
request->UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"; 

request->Headers->Add("Accept-Encoding", "gzip,deflate,sdch"); 
request->Headers->Add("Accept-Language", "en-US;q=0.6,en;q=0.4"); 
request->Headers->Add("X-Requested-With", "XMLHttpRequest"); 
request->Headers->Add("DNT", "1"); 
request->Headers->Add("Origin", "https://" + request->Host); 


System::IO::Stream ^stream = request->GetRequestStream(); // this crashes 
stream->Write(buffer, 0, buffer->Length); 

stream->Flush(); 
stream->Close(); 
delete stream; 

System::Net::HttpWebResponse ^response = safe_cast<System::Net::HttpWebResponse^>(request->GetResponse()); 

for each(System::Net::Cookie ^cookie in response->Cookies) 
{ 
    if (cookie->Name->ToUpper()->Equals("NPP")) 
    { 
     msclr::interop::marshal_context context; 

     _key = context.marshal_as<std::string>(cookie->Value); 
     break; 
    } 
} 

request->Abort(); 
response->Close(); 

delete request; 
delete response; 

return !_key.empty(); 

}

답변

0

삭제이 라인 :이 시스템 ::는 IDisposable 인터페이스를 구현하는 경우 C++/CLI에서 delete stream;

가 통화를 관리되는 개체의 폐기 방법을 삭제하고, 스트림이하는 그것을 구현 .

그러나 해당 코드에서 close() 함수가 이미 호출 된 코드 인 close() 함수는 Dispose 메서드도 호출합니다. 따라서 스트림에서 Dispose()를 두 번 호출하는 코드는 오류의 원인이라고 생각합니다.

관련 문제