【问题标题】:.NET SOAP request returns "400 Bad Request".NET SOAP 请求返回“400 错误请求”
【发布时间】: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


【解决方案1】:

尝试从肥皂消息中删除回车 .Replace("\r\n", ""); 如果不起作用,请验证 fiddler 发送的 http 请求,对我来说非常有帮助。

【讨论】:

  • 将所有的 XML 放在一行中。 SoapEnvelopeXml.LoadXml("schemas.xmlsoap.org/soap/envelope\" xmlns:tem=\"tempuri.org\">
    " 没有任何改变
  • Fiddler 不会拦截对 localhost 的 SOAP 调用。为什么 - 我不知道
  • Fiddler拦截所有http消息,SOAP是用于HTTP的消息协议。您只需要在 Tools->Fiddler OPtions->Connections 中将 Fildder 配置为像逃生代理一样执行。
猜你喜欢
  • 2019-07-28
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多