私はいくつかのコードを持っています(実際にはWebインターフェイス経由でSMSメッセージを送信するためのものですが、それは関係ありません)。プロキシサーバーのにはのコードが正常に動作しますが、1人の顧客がこの構成を使用したいと考えています。私はプロキシを使ってテストしていますが、動作させることはできません。助けて強とき、私は知恵のこの真珠が含まれているMSKBの記事195650を(のWinInetとプロキシの承認を処理する方法)、見つかった:MFC + Wininet +プロキシ認証=問題
There are several ways to handle HTTP_STATUS_PROXY_AUTH_REQ without
displaying a user interface. By far the easiest way to do this is by
using the InternetSetOption function with the flags
INTERNET_OPTION_PROXY_PASSWORD and INTERNET_OPTION_PROXY_USERNAME...
...The same functionality can be accomplished in an MFC application
by detecting HTTP_STATUS_PROXY_AUTH_REQ, calling
CHttpConnection::SetOption, then re-calling CHttpFile::SendRequest.
だから私はから407エラーを検出し、私のコードでは、このソリューションを実装しましたプロキシが認証を必要とする、とSetOptionメソッド呼び出しを経由して、その後、基本認証を供給:
if (AfxParseURL (m_csServerUrl, dwServiceType, csServerName, csObjectName, nPort))
{
CString csProxy = m_pOwner->GetProxyServerSetting();
if (csProxy.GetLength() > 0)
{
pSession = new CMyInternetSession (TEXT("SmGen"),
1,
INTERNET_OPEN_TYPE_PROXY,
csProxy,
NULL,
INTERNET_FLAG_KEEP_CONNECTION);
}
else
{
pSession = new CMyInternetSession (TEXT("SmGen"),
1,
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
0);
}
if (pSession)
{
pSession->SetOwnerDialog (m_pOwner);
pHttpConn = pSession->GetHttpConnection (csServerName, (INTERNET_PORT)nPort, NULL, NULL);
if (pHttpConn)
{
dwFlags = INTERNET_FLAG_RELOAD |
INTERNET_FLAG_DONT_CACHE;
pHttpFile = pHttpConn->OpenRequest (CHttpConnection::HTTP_VERB_GET,
csObjectName + TEXT("?") + csHTTP,
NULL,
1,
NULL,
NULL,
dwFlags);
if (pHttpFile)
{
pHttpFile->AddRequestHeaders (csHeaders);
if (pHttpFile->SendRequest())
{
pHttpFile->QueryInfoStatusCode (dwResult);
bRetryWithAuth = FALSE;
switch (dwResult)
{
case HTTP_STATUS_OK:
// log success
break;
case HTTP_STATUS_PROXY_AUTH_REQ:
bRetryWithAuth = TRUE;
break;
default:
// log failure
break;
}
if (bRetryWithAuth)
{
csProxyUsr = m_pOwner->GetProxyUsername();
csProxyPwd = m_pOwner->GetProxyPassword();
pHttpConn->SetOption (INTERNET_OPTION_PROXY_USERNAME,
csProxyUsr.GetBuffer(1),
csProxyUsr.GetLength());
csProxyUsr.ReleaseBuffer();
pHttpConn->SetOption (INTERNET_OPTION_PROXY_PASSWORD,
csProxyPwd.GetBuffer(1),
csProxyPwd.GetLength());
csProxyPwd.ReleaseBuffer();
if (pHttpFile->SendRequest())
{
// ... TIMEOUT
を今すぐ問題のために。問題は、2番目のSendRequestが失敗しないか、別のエラーが発生したことです。がタイムアウトしました。です。しばらくすると、ラッパーハンドラを介してCInternetException 12002(タイムアウト)がスローされます。これは少し面倒です。言うまでもなく、SMSは決して到着しません。
プロキシサーバーのアドレスは、DNSを原因とする要因を取り除くために、a.b.c.d:8080の形式です。私のMIS部門は、私が提供しているユーザー名とパスワードが有効であることを保証しています(私が悪いuid/pwdを渡すと、単に407エラーに戻ってしまうので、少なくともプロキシに到達しています)。
私はここでオンラインで見つけることができるすべてを経験しており、私はどこにもいません。単にINTERNET_OPEN_TYPE_PRECONFIGを使用して、システムが自動的に必要なものをすべて取得することを期待しているのは、あなたが持っているものすべてが悲しいかなかプロキシだとすればうまくいきません。
コードの非プロキシ関連の機能に問題はないことを覚えておいてください。サーバーip:portを提供するレジストリエントリを消去してプロキシを削除すると、再びすべてのものに飛躍するからです。
私は完全に困惑しています。誰もこれを見たことがありますか? (プロキシをカバーMSのサンプルがあるので、私は、WINHTTPを使用するには、このコードを変換しました
:ノーリプライでプロキシ認証についてのクエリの数を考えると、期待してないんだけど...
編集とにかくWinInetは推奨されなくなりました。すべて今はうまく動作します。
あなたがプロキシになっていることを知っていれば...おそらくWiresharkでスヌーピングすると役に立つ情報が得られるでしょうか?または、おそらくフィドラー? – dgnorton