VB6的MSXML2.XMLHTTP与C#的WebResponse

时间:2019-07-19 23:43:59

标签: c# soap vb6

我希望不必提供VB6示例就可以知道造成此问题的原因,但是如有必要,我可以添加它。

我在C#(.NET 4.5)和VB6中都有一个简单的SOAP客户端。 C#代码使用WebResponse处理我的请求,在VB6中,我使用MSXML2.XMLHTTP。

它们都使用相同的用户URL,相同的服务URL,相同的操作,相同的有效负载,相同的标头在同一台计算机上运行,​​并且均未发送任何身份验证信息。 VB6获得了预期的响应,但是调用WebResponse response = request.GetResponse()时,我的C#得到了身份验证错误。

我不会与任何一个客户端发送任何形式的身份验证。

C#代码如下:

using System.Net;
using System.IO;
using System.Text;

namespace CarryUpReport
{
    public class PricedexHttpClient
    {
        public void Send(string url, string action, string body)
        {
            HttpWebRequest request = CreateWebRequest(url, action);
            request.AllowWriteStreamBuffering = false; // see: https://support.microsoft.com/en-us/help/908573/a-post-or-put-request-may-fail-when-you-use-the-httpwebrequest-class-t

            byte[] byteArray = Encoding.UTF8.GetBytes(body);
            request.ContentLength = byteArray.Length;

            Stream stream = null;
            try
            {
                stream = request.GetRequestStream();
                stream.Write(byteArray, 0, byteArray.Length);

                // the next line throws an exception:
                using (WebResponse response = request.GetResponse())
                {
                    using (StreamReader rd = new StreamReader(response.GetResponseStream()))
                    {
                        string soapResult = rd.ReadToEnd();
                    }
                }
            }
            finally
            {
                if (null != stream) stream.Dispose();
            }
        }

        public static HttpWebRequest CreateWebRequest(string url, string action)
        {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
            webRequest.Headers.Add(@"SOAPAction", action);
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            return webRequest;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

这很可疑

        using (Stream stream = request.GetRequestStream())
        {
            stream.Write(byteArray, 0, byteArray.Length);
        }

尝试在实际发送请求之前不处理请求流

        Stream stream = request.GetRequestStream())
        stream.Write(byteArray, 0, byteArray.Length);
        stream.Close()

(上面的航空代码)

答案 1 :(得分:0)

我不知道服务器需要身份验证。似乎VB6代码会自动传递已登录用户的凭据。所以我通过添加以下内容解决了这个问题:

webRequest.UseDefaultCredentials = true;