2011-07-28 60 views
3

私はいくつかのコードを持っています(実際には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は推奨されなくなりました。すべて今はうまく動作します。

+0

あなたがプロキシになっていることを知っていれば...おそらくWiresharkでスヌーピングすると役に立つ情報が得られるでしょうか?または、おそらくフィドラー? – dgnorton

答えて

-1

通常、HTTP接続は、クライアントが応答を受信した後に閉じられます。 認証情報を含む2番目のリクエストを送信するときには、プロキシは接続を閉じているか(少なくとも受信を停止しています)。

新しい接続を確立するには、再度OpenRequestを呼び出す必要があります。

+0

これはMSDNドキュメントと矛盾していますが、私は再送信する必要があると言いますが、試してみるのは簡単ですから、明日の朝に行って報告します。 –

+0

いいえ、要求を再作成できませんでした。 –

+0

応答を受信すると、HTTP接続が閉じられません。それが本当ならば、それはWeb通信をもっと遅くするでしょう。 –