我希望不必提供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;
}
}
}
答案 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;