2009-06-02 26 views
2

従来のVB6コンポーネント(私が書いていない)を.NETプラットフォームに更新しようとしています。VB6 HTTP要求をVB.Net 2.0に変換する

Public Function PostXml(ByVal XML As String) As Boolean 

     Try 
      Dim URL As String = My.Settings.NTSPostURL 
      'TODO: supply username and password! ' 
      Dim Bytes As Byte() = Me.Encoding.GetBytes(XML) 
      Dim HTTPRequest As HttpWebRequest = DirectCast(WebRequest.Create(Me.PostURL), HttpWebRequest) 
      Dim Cred As New NetworkCredential("username", "password", "http://www.xxx.com") 

      With HTTPRequest 
       .Method = "POST" 
       .ContentLength = Bytes.Length 
       .ContentType = "text/xml" 
       .Credentials = Cred 
       .Timeout = 120000 
       .Method = "Submit" 
      End With 

      Using RequestStream As Stream = HTTPRequest.GetRequestStream() 
       RequestStream.Write(Bytes, 0, Bytes.Length) 
       RequestStream.Close() 
      End Using 

      Using Response As HttpWebResponse = DirectCast(HTTPRequest.GetResponse(), HttpWebResponse) 

       If Response.StatusCode <> HttpStatusCode.OK Then 

        Dim message As String = [String].Format("POST failed. Received HTTP {0}", Response.StatusCode) 

        Throw New ApplicationException(message) 

       End If 

      End Using 

     Catch ex As WebException 
      Dim s As String = ex.Response.ToString() & " " & ex.Status.ToString() 
      Throw 
     End Try 

    End Function 

私は.NETコードを実行したときただし、サーバーが禁断のエラー「403を返します:私はこれを更新した

Function PostToUrl(ByRef psUrl, ByRef psData, Byref psResponseText, ByRef psErrorMsg, ByRef psUsername, ByRef psPassword) 

    On Error Resume Next  
    Dim objWinHTTP 

    PostToUrl = False 
    psErrorMsg = "" 
    psResponseText = "" 
    Dim m_lHTTPREQUEST_SETCREDENTIALS_FOR_SERVER 
    m_lHTTPREQUEST_SETCREDENTIALS_FOR_SERVER =0 

    Set objWinHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") 


    objWinHTTP.Open "POST", psUrl 

    If psUsername <> "" Then 
     Call objWinHTTP.SetCredentials(psUsername, psPassword, m_lHTTPREQUEST_SETCREDENTIALS_FOR_SERVER) 
    End If 
    objWinHTTP.SetRequestHeader "Host", "http://www.xxx.com/CSIHTTP.asp" 
    objWinHTTP.SetRequestHeader "X-Method", "Submit" 
    objWinHTTP.SetRequestHeader "Content-Type", "text/xml" 

    objwinHTTP.setTimeouts 3000, 15000, 15000, 120000 


    Call objWinHTTP.Send(psData) 

    ' Handle errors ' 


    If Err.Number <> 0 Then 

     psErrorMsg = Err.Description & " test" 
     PostToUrl = False 

    ElseIf objWinHTTP.Status <> 200 AND objWinHTTP.Status <> 202 Then 

     psErrorMsg = "(" & objWinHTTP.Status & ") " & objWinHTTP.StatusText 
     PostToUrl = False 

    Else 

     psErrorMsg = objWinHTTP.ResponseText & "(" & objWinHTTP.Status & ") " & objWinHTTP.StatusText 
     PostToUrl = True 

    End If 

    Set objWinHTTP = Nothing 
End Function 

:記事URLへのXML文字列の一つの機能があります - プロトコルエラー ': Using Response As HttpWebResponse = DirectCast(HTTPRequest.GetResponse(), HttpWebResponse) 。 VB6コードは正常に動作します。誰かがこれを引き起こしている可能性のある2つの間の矛盾を特定できますか?それは私に困ったままになっています....

+0

このような低品質で始まるものは簡単に移植できません。あなたはより機能的なレベルでコンポーネントを分析し、.NETで新鮮なものを実装したくないと確信していますか? – AnthonyWJones

+0

絶対に!私はこのVB6関数を特に掘り下げている唯一の理由は、実行する.NETコードを取得できなかったことです。 – Simon

答えて

1

多くの痛みの後、私は最終的にそれを動作させることができました。問題はテキストエンコーディングで、ASCIIに変更してすべて動作します:

Try 
      Dim Bytes As Byte() = Me.Encoding.GetBytes(XML) 
      Dim HTTPRequest As HttpWebRequest = DirectCast(WebRequest.Create(Me.PostURL), HttpWebRequest) 

      With HTTPRequest 
       .Method = "POST" 
       .ContentLength = Bytes.Length 
       .ContentType = "text/xml" 
       .Credentials = New NetworkCredential("user", "password") 'myCache 
      End With 

      Using RequestStream As Stream = HTTPRequest.GetRequestStream() 
       RequestStream.Write(Bytes, 0, Bytes.Length) 
       RequestStream.Close() 
      End Using 

      Using Response As HttpWebResponse = DirectCast(HTTPRequest.GetResponse(), HttpWebResponse) 

       Return Response.StatusCode 

      End Using 

     Catch ex As WebException 
      Dim s As String = ex.Status.ToString 
      Throw 
     End Try 

ありがとうございました。すべてのラウンドアップアップ。

2

私はそれを紛失していない限り、あなたはHOSTヘッダーint .netバージョンを設定しているように見えません。あなたのサーバーがHostHeaderResolutionを使用して同じIPアドレス上に複数のドメインをホストしている場合は、403を取得します。

これは当然のことです。

+0

実際、VB6の例では完全には一般的ではないHostヘッダーのURL全体を使用しているので、これは良い推測のようです。 – steamer25

+0

あなたの返信をありがとう、これを設定する方法を知っていますか?私が見る限り、これを設定する財産はありません。 – Simon

+0

Hostヘッダーのものは非常に奇妙です。 1. WinHTTPコンポーネントは、URLから描画するためのホストヘッダーを追加します。これはHTTP/1.1の要件です。 2.ホストヘッダーはURLのホスト名部分でなければなりません。追加のパス要素を含めるべきではありません。 – AnthonyWJones

2

トラフィックを2つのソースからキャプチャして比較しようとしましたか?

無料のHTTPデバッグプロキシであるFiddler http://www.fiddler2.com/fiddler2/を試してみましょう。

これでうまくいかない場合は、無料のプロトコルアナライザーであるWireSharkを試すことができます(ビットレベルが少し下になるので、除外する詳細が多くなります)。 http://www.wireshark.org/

1

資格情報が正しくソートされているとは思いません。 URLの権限部分を信任状のドメインとして使用しています。

はこのようにそれを試してみてください -

Dim myCache as New CredentialCache() 
myCache.Add(New Uri("http://www.xxx.com"), "Basic", New NetworkCredential("username", "password")) 

HTTPRequest.Credentials = myCache 

これは、基本認証が必要であることを前提とし、他の候補は、ドメインを必要とするかもしれない「ダイジェスト」または「NTLM」になります。ところで、私はこの種のもののためにあなたが本当にツールが必要、steamer25に同意

Dim myCache as New CredentialCache() 
myCache.Add(New Uri("http://www.xxx.com"), "NTLM", New NetworkCredential("username", "password", "domain")) 

HTTPRequest.Credentials = myCache 

- :たとえば、ユーザー名のテキストは、この古いコードで「ドメイン\ユーザー名」、あなたが望むようなものである場合フィドラーなど。

このコードが実行されているマシンで古いものを扱っている例があります。 fiddlerを起動して、proxycfg -uコマンドを使用します。これで、オリジナルのものがASPサーバーで持っているコンバートステーションを観察できます。 phiddlerを閉じる前にproxycfg -dを使用してください。

アプリの.configで、次のあなたの.NETコードの代わりに: -

<system.net> 
    <defaultProxy enabled="false"> 
     <proxy proxyaddress="http://127.0.0.1:8888" bypassonlocal="False"/> 
    </defaultProxy> 
</system.net> 

スタートシオマネキや「真」に有効な属性をフリック。これで、新しいコードがASPサーバーで持っていようとしている会話が表示されるはずです。フィドラーキャプチャーなしで新しいコードを使用する前に、enabled = "false"を設定してください。

関連する問題