VB6 的 MSXML2.XMLHTTP 与 C# 的 WebResponse
VB6's MSXML2.XMLHTTP vs C#'s WebResponse
我希望有人可能知道我的问题的原因而不必提供我的 VB6 示例,但如果需要我可以添加它。
我在 C# (.NET 4.5) 和 VB6 中都有一个简单的 SOAP 客户端。 C# 代码使用 WebResponse 来处理我的请求,在 VB6 中我使用 MSXML2.XMLHTTP.
它们 运行 在同一台机器上,使用相同的用户帐户,使用完全相同的服务 URL,相同的操作,相同的负载,相同的 headers , 并且没有人发送任何认证信息。 VB6 得到了预期的响应,但我的 C# 在调用 WebResponse 时收到身份验证错误 response = request.GetResponse().
我不会向任一客户端发送任何形式的身份验证。
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;
}
}
}
我不知道服务器需要身份验证。似乎 VB6 代码自动传递了登录用户的凭据。所以我通过添加解决了这个问题:
webRequest.UseDefaultCredentials = true;
我希望有人可能知道我的问题的原因而不必提供我的 VB6 示例,但如果需要我可以添加它。
我在 C# (.NET 4.5) 和 VB6 中都有一个简单的 SOAP 客户端。 C# 代码使用 WebResponse 来处理我的请求,在 VB6 中我使用 MSXML2.XMLHTTP.
它们 运行 在同一台机器上,使用相同的用户帐户,使用完全相同的服务 URL,相同的操作,相同的负载,相同的 headers , 并且没有人发送任何认证信息。 VB6 得到了预期的响应,但我的 C# 在调用 WebResponse 时收到身份验证错误 response = request.GetResponse().
我不会向任一客户端发送任何形式的身份验证。
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;
}
}
}
我不知道服务器需要身份验证。似乎 VB6 代码自动传递了登录用户的凭据。所以我通过添加解决了这个问题:
webRequest.UseDefaultCredentials = true;