【发布时间】:2014-10-24 01:43:36
【问题描述】:
我正在尝试创建一个对 Web 服务的简单 XML SOAP 请求。
服务本身被证明是可以的,我通过使用 WSDL 生成的类访问它没有任何问题。但如果我尝试使用常规 WebRequest 访问它 - 它总是返回 400 Bad Request。
这是我的代码:
class Program
{
static void Main(string[] args)
{
HttpWebRequest request = CreateWebRequest("http://localhost:8000/ExchangeService", "WhoAmI");
XmlDocument SoapEnvelopeXml = new XmlDocument();
SoapEnvelopeXml.LoadXml(
@"<?xml version=""1.0""?>
<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope""
xmlns:tem=""http://tempuri.org"">
<soapenv:Header/>
<soapenv:Body>
<tem:WhoAmI/></soapenv:Body></soapenv:Envelope>");
using (Stream stream = request.GetRequestStream())
{
SoapEnvelopeXml.Save(stream);
}
using (WebResponse response = request.GetResponse())
{
using (StreamReader rd = new StreamReader(response.GetResponseStream()))
{
string soapResult = rd.ReadToEnd();
Console.WriteLine(soapResult);
}
}
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
public static HttpWebRequest CreateWebRequest(string url, string soapAction)
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.ContentType = "text/xml;charset=UTF-8;action=\"" + soapAction + "\"";
webRequest.Method = "POST";
return webRequest;
}
}
XML 是由 SoapUI 生成的,并且可以完美地工作。这是 SoapUI 的 HTTP 标头:
POST http://localhost:8000/ExchangeService HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://tempuri.org/IExchangeFunctions/WhoAmI"
Content-Length: 211
Host: localhost:8000
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
我做错了什么?
UPD:将服务从我的更改为某些第三方: http://wsf.cdyne.com/WeatherWS/Weather.asmx 通过 WSDL - 它可以工作。 SoapUI 返回数据。来自我的代码 - 内部错误 500。
【问题讨论】:
-
如果您可以通过从 WSDL 生成的代理调用服务 - 那么为什么不这样做呢?如果您必须通过 HttpWebRequest 执行此操作,那么您应该使用 Fiddler 或其他东西来查看您在线发送的内容 - 将其与 soapUI 发送的内容进行比较。最后,养成使用 LINQ to XML 或其他一些基于 XML 的 API 来创建 XML 的习惯。这些 API 了解 XML 的规则。字符串不知道 XML 规则。由于 XML 错误,您可能会收到 400 错误。
-
我猜你正在用
soapEnvelopeXml.Save调用编写 BOM。使用 Fiddler(或您选择的 HTTP 调试器)比较您和 SoapUI 的请求以进行确认。 -
我知道,但我只是在我自己创建的服务上创建仅使用 XML 字符串处理 SOAP 请求的概念验证。
-
这个 XML 是由 SoapUI 生成的,它从我的服务中收到了正确的响应,因此证明是正确的。
标签: c# soap httprequest