【问题标题】:C++/CLI HttpWebRequest::GetRequestStream() fails after first time第一次后 C++/CLI HttpWebRequest::GetRequestStream() 失败
【发布时间】:2014-04-24 20:08:00
【问题描述】:

我不得不在我的一个程序中使用 C++/CLI,但我以前从未使用过它。所以它给了我一些问题。这基本上是一个向登录页面发送 http 请求的函数。它适用于我尝试的第一个用户,但对于第二个用户,它在 GetRequestStream() 上失败。我对此进行了谷歌搜索,大多数主题都是关于删除/处置它。我相信我现在正在这样做?我仍然必须等待 20 秒才能超时(超时异常)。我不知道如何解决这个问题。

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();

}

【问题讨论】:

    标签: c++ httpwebrequest response dispose command-line-interface


    【解决方案1】:

    删除这一行:delete stream;

    在 C++/CLI 中,如果托管对象实现了 System::IDisposable 接口,delete 将调用 Dispose 方法,而 Stream 确实实现了它。

    但是代码已经在该流上调用了 close() 函数,close() 函数也调用了 Dispose 方法。因此,在该流上两次调用 Dispose() 的代码,我认为这就是您出错的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多