【问题标题】:What's the equivalent of XMLHTTP from VB6 in C# .Net 2005?C# .Net 2005 中的 VB6 中的 XMLHTTP 等价物是什么?
【发布时间】:2008-10-10 02:35:32
【问题描述】:

我正在尝试转换一些在 VB 中运行良好的代码,但我不知道在 .Net 中要使用哪些对象。

    Dim oXMLHttp As XMLHTTP
    oXMLHttp = New XMLHTTP
    oXMLHttp.open "POST", "https://www.server.com/path", False
    oXMLHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    oXMLHttp.send requestString 

基本上,我想将 XML 文件发送到服务器,然后存储它返回的响应。谁能指出我正确的方向?

【问题讨论】:

  • 接受的答案不是 C#,如果您正在将 VB6 移植到 VB.NET,并且希望保留尽可能多的代码库,那么请重新标记到 VB.NET。

标签: c# xml http vb6


【解决方案1】:

答案是使用WebClient类:-

WebClient webClient = new WebClient();

NameValueCollection values = new NameValueCollection();

values.add("firstname", "Slarti");
values.add("lastname", "Bart-fast");

byte[] response = webClient.UploadValues("http://server/path", values);

UploadValues 方法使用 application/x-www-form-urlencoded 内容类型构建 POST 请求,并正确编码传递给它的 NameValueCollection 中列出的值集。

响应是一个字节数组,然后您可以使用它做一些适当的事情。

【讨论】:

    【解决方案2】:

    有关执行此操作的示例,请参见以下内容:http://www.codeproject.com/KB/dotnet/NET_Interact_j2EE.aspx 我把样本放在下面。对不起,我知道它很大,但你永远不知道这样的链接会保持多久。 注意:问题的第一个版本没有在 C# .NET 中说 - 它只是说“在 .NET 中”。 (也许它被标记为 C# 而我没有看到它)从 VB.NET 转换为 C# 非常容易(尽管没有必要)。 '这个类代表了与 MSXML.XMLHTTP 中的 xmlHTTP 对象相同的功能。

    Imports System.Net
    Imports System.Web.HttpUtility
    
    Public Class XMLHTTP
    'Makes an internet connection to specified URL 
       Public Overridable Sub open(ByVal bstrMethod As String, _
         ByVal bstrUrl As String, Optional ByVal varAsync As _
         Object = False, Optional ByVal bstrUser _
         As Object = "", Optional ByVal bstrPassword As Object = "")
           Try
               strUrl = bstrUrl
               strMethod = bstrMethod
    
               'Checking if proxy configuration 
               'is required...(blnIsProxy value 
               'from config file)
               If blnIsProxy Then
               'Set the proxy object
                   proxyObject = WebProxy.GetDefaultProxy()
    
                   'Finding if proxy exists and if so set 
                   'the proxy configuration parameters...
                   If Not (IsNothing(proxyObject.Address)) Then
                       uriAddress = proxyObject.Address
                       If Not (IsNothing(uriAddress)) Then
                           _ProxyName = uriAddress.Host
                           _ProxyPort = uriAddress.Port
                       End If
                       UpdateProxy()
                   End If
                   urlWebRequest.Proxy = proxyObject
               End If
    
               'Make the webRequest...
               urlWebRequest = System.Net.HttpWebRequest.Create(strUrl)
               urlWebRequest.Method = strMethod
    
               If (strMethod = "POST") Then
                   setRequestHeader("Content-Type", _
                       "application/x-www-form-urlencoded")
               End If
    
               'Add the cookie values of jessionid of weblogic 
               'and PH-Session value of webseal 
               'for retaining the same session
               urlWebRequest.Headers.Add("Cookie", str_g_cookieval)
    
           Catch exp As Exception
               SetErrStatusText("Error opening method level url connection")
           End Try
       End Sub
       'Sends the request with post parameters...
       Public Overridable Sub Send(Optional ByVal objBody As Object = "")
           Try
               Dim rspResult As System.Net.HttpWebResponse
               Dim strmRequestStream As System.IO.Stream
               Dim strmReceiveStream As System.IO.Stream
               Dim encode As System.Text.Encoding
               Dim sr As System.IO.StreamReader
               Dim bytBytes() As Byte
               Dim UrlEncoded As New System.Text.StringBuilder
               Dim reserved() As Char = {ChrW(63), ChrW(61), ChrW(38)}
               urlWebRequest.Expect = Nothing
               If (strMethod = "POST") Then
                   If objBody <> Nothing Then
                       Dim intICounter As Integer = 0
                       Dim intJCounter As Integer = 0
                       While intICounter < objBody.Length
                         intJCounter = _
                           objBody.IndexOfAny(reserved, intICounter)
                         If intJCounter = -1 Then
    UrlEncoded.Append(System.Web.HttpUtility.UrlEncode(objBody.Substring(intICounter, _
                                                        objBody.Length - intICounter)))
                           Exit While
                         End If
    UrlEncoded.Append(System.Web.HttpUtility.UrlEncode(objBody.Substring(intICounter, _
                                                            intJCounter - intICounter)))
                         UrlEncoded.Append(objBody.Substring(intJCounter, 1))
                         intICounter = intJCounter + 1
                       End While
    
                       bytBytes = _
                         System.Text.Encoding.UTF8.GetBytes(UrlEncoded.ToString())
                       urlWebRequest.ContentLength = bytBytes.Length
                       strmRequestStream = urlWebRequest.GetRequestStream
                       strmRequestStream.Write(bytBytes, 0, bytBytes.Length)
                       strmRequestStream.Close()
                    Else
                        urlWebRequest.ContentLength = 0
                   End If
               End If
               rspResult = urlWebRequest.GetResponse()
               strmReceiveStream = rspResult.GetResponseStream()
               encode = System.Text.Encoding.GetEncoding("utf-8")
               sr = New System.IO.StreamReader(strmReceiveStream, encode)
    
               Dim read(256) As Char
               Dim count As Integer = sr.Read(read, 0, 256)
               Do While count > 0
                   Dim str As String = New String(read, 0, count)
                   strResponseText = strResponseText & str
                   count = sr.Read(read, 0, 256)
               Loop
           Catch exp As Exception
               SetErrStatusText("Error while sending parameters")
               WritetoLog(exp.ToString)
           End Try
       End Sub
       'Setting header values...
       Public Overridable Sub setRequestHeader(ByVal bstrHeader _
                             As String, ByVal bstrValue As String)
           Select Case bstrHeader
                Case "Referer"
                    urlWebRequest.Referer = bstrValue
                Case "User-Agent"
                    urlWebRequest.UserAgent = bstrValue
                Case "Content-Type"
                    urlWebRequest.ContentType = bstrValue
                Case Else
                    urlWebRequest.Headers(bstrHeader) = bstrValue
           End Select
       End Sub
    
       Private Function UpdateProxy()
           Try
               If Not (IsNothing(uriAddress)) Then
                   If ((Not IsNothing(_ProxyName)) And _
                     (_ProxyName.Length > 0) And (_ProxyPort > 0)) Then
                       proxyObject = New WebProxy(_ProxyName, _ProxyPort)
                       Dim strByPass() As String = Split(strByPassList, "|")
                       If strByPass.Length > 0 Then
                           proxyObject.BypassList = strByPass
                       End If
                       proxyObject.BypassProxyOnLocal = True
                       If blnNetworkCredentials Then
                           If strDomain <> "" Then
                               proxyObject.Credentials = New _
                                 NetworkCredential(strUserName, _
                                 strPwd, strDomain)
                           Else
                                proxyObject.Credentials = New _
                                  NetworkCredential(strUserName, _
                                  strPwd)
                           End If
                       End If
                   End If
               End If
           Catch exp As Exception
               SetErrStatusText("Error while updating proxy configurations")
               WritetoLog(exp.ToString)
           End Try
       End Function
       'Property for setting the Responsetext
       Public Overridable ReadOnly Property ResponseText() As String
           Get
               ResponseText = strResponseText
           End Get
       End Property
    
       Private urlWebRequest As System.Net.HttpWebRequest
       Private urlWebResponse As System.Net.HttpWebResponse
       Private strResponseText As String
       Private strUrl As String
       Private strMethod As String
       Private proxyObject As WebProxy
       Private intCount As Integer
       Private uriAddress As Uri
       Private _ProxyName As String
       Private _ProxyPort As Integer
    End Class
    

    【讨论】:

    • 我猜是因为代码块很大,但你永远不知道这样的链接会保持多久有效。它做他想做的事!
    • P.S.使用 searchdotnet.com The Dan Appleman 的自定义 Google 搜索找到的!
    • 哎呀!那是很多代码!但它看起来像是我现有代码的直接替代品。谢谢!
    • 也许您应该将上述代码移植到 C# 以匹配在 C# 中要求等效项的问题
    • 我认为问题的第一个版本没有说。在 C# .NET 中 - 它只是说“在 .NET 中”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多