Again:
try
{
pHttpFile->SendRequest();
}
catch(CInternetException* e)
{
int err = GetLastError();
if (err == ERROR_INTERNET_INVALID_CA)
{
DWORD dwFlags = 0;
DWORD dwBuffLen = sizeof(dwFlags);
dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
// | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA
// | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
// NULL) != ERROR_SUCCESS)
// {
// throw e;
// }
goto Again;
}
方法 2。而无需用户界面:
与 MFC WinInet 类可以使用相似的逻辑。在这种情况下,下面的 MFC 方法对应于 WinInet 上面使用的 Api:
注 1: InternetErrorDlg 可能会返回下列值:
仅当返回 ERROR_INTERNET_FORCE_RETRY 时,应重新提交请求。在 Internet Explorer 4.0 和 4.01 中,但是,该请求必须重新提交即使返回 ERROR_SUCCESS。
Microsoft 已经确认这是 InternetErrorDlg API 中的问题。注 2: SECURITY_FLAG_IGNORE_UNKNOWN_CA 在 Internet Explorer 3.0 和 3.02 未实现。
InternetErrorDlg 仍然起作用,但有以下例外。此 API 生成对话框中不允许忽略无效的证书颁发机构的错误 ;它是只是通知给用户的页面无法查看。
注 3: 发生错误前,不能设置选项,将忽略此错误。首先,您必须尝试发送请求,收到错误消息,然后设置选项 (或调用 InternetErrorDlg),并重新提交。
try
{
pHttpFile->SendRequest();
}
catch(CInternetException* e)
{
int err = GetLastError();
if (err == ERROR_INTERNET_INVALID_CA)
{
DWORD dwFlags = 0;
DWORD dwBuffLen = sizeof(dwFlags);
//无用户界面
pHttpFile->QueryOption(INTERNET_OPTION_SECURITY_FLAGS,(LPVOID)&dwFlags,&dwBuffLen);dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
pHttpFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS,&dwFlags,sizeof(dwFlags));
//有用户界面
// if (pHttpFile->ErrorDlg(GetDesktopWindow(),err, FLAGS_ERROR_UI_FILTER_FOR_ERRORS// | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA
// | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
// NULL) != ERROR_SUCCESS)
// {
// throw e;
// }
goto Again;
}
}
以下摘自http://support.microsoft.com/kb/182888/zh-cn
方法 1。与用户界面 (生成一个消息框,类似于 Internet Explorer):
... Again: if (!HttpSendRequest (hReq,...)) dwError = GetLastError (); if (dwError == ERROR_INTERNET_INVALID_CA) { // Make sure to check return code from InternetErrorDlg // user may click either OK or Cancel. In case of Cancel // request should not be resumbitted. InternetErrorDlg (GetDesktopWindow(), hReq, ERROR_INTERNET_INVALID_CA, FLAGS_ERROR_UI_FILTER_FOR_ERRORS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, NULL); goto again; } ...
... Again: if (!HttpSendRequest (hReq,...)) dwError = GetLastError (); if (dwError == ERROR_INTERNET_INVALID_CA) { DWORD dwFlags; DWORD dwBuffLen = sizeof(dwFlags); InternetQueryOption (hReq, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen); dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA; InternetSetOption (hReq, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags) ); goto again; } ...
- CInternetFile::SendRequest
- CInternetFile::QueryOption
- CInternetFile::SetOption
- CInternetFile::ErrorDlg
注 1: InternetErrorDlg 可能会返回下列值:
ERROR_SUCCESS ERROR_CANCELLED ERROR_INTERNET_FORCE_RETRY.
Microsoft 已经确认这是 InternetErrorDlg API 中的问题。注 2: SECURITY_FLAG_IGNORE_UNKNOWN_CA 在 Internet Explorer 3.0 和 3.02 未实现。
InternetErrorDlg 仍然起作用,但有以下例外。此 API 生成对话框中不允许忽略无效的证书颁发机构的错误 ;它是只是通知给用户的页面无法查看。
注 3: 发生错误前,不能设置选项,将忽略此错误。首先,您必须尝试发送请求,收到错误消息,然后设置选项 (或调用 InternetErrorDlg),并重新提交。