C# .NET SOAP请求返回“400错误请求”

C# .NET SOAP请求返回“400错误请求”,c#,soap,httprequest,C#,Soap,Httprequest,我试图创建一个简单的XML SOAP请求到web服务 服务本身被证明是正常的,我使用WSDL生成的类访问它,没有任何问题。但如果我尝试使用常规WebRequest访问它,它总是返回400个错误请求 这是我的密码: class Program { static void Main(string[] args) { HttpWebRequest request = CreateWebRequest("http://localhost:8000/ExchangeSe

我试图创建一个简单的XML SOAP请求到web服务

服务本身被证明是正常的,我使用WSDL生成的类访问它,没有任何问题。但如果我尝试使用常规WebRequest访问它,它总是返回400个错误请求

这是我的密码:

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;
    }
}
我做错了什么

UPD:将服务从my更改为某个第三方:
通过WSDL,它可以工作。SoapUI返回数据。来自我的代码-内部错误500。

尝试从soap消息中删除回车符 。替换\r\n;
如果不起作用,请验证使用fiddler发送的http请求,这对我非常有帮助。

如果您可以通过WSDL生成的代理调用服务,那么为什么不这样做呢?如果您必须通过HttpWebRequest来完成,那么您应该使用Fiddler或其他工具来查看您在线路上发送的内容—将其与soapUI发送的内容进行比较。最后,养成使用LINQtoXML或其他基于XML的API创建XML的习惯。这些API知道XML的规则。字符串不知道XML规则。由于错误的XML,您可能会遇到400错误。我猜您正在使用soapEnvelopeXml.Save调用编写BOM。使用Fiddler或您选择的HTTP调试器来比较您的和SoapUI请求以进行确认。我知道,但我只是在我自己创建的服务上创建了仅使用XML字符串处理SOAP请求的概念证明。此XML由SoapUI生成,它从我的服务收到了正确的响应,因此,它被证明是正确的。将所有XML放在一行中。SoapEnvelopeXml.LoadXml Nothing ChangedDDler不拦截对本地主机的SOAP调用。为什么-我不知道Fiddler会截获所有http消息,SOAP是一种用于http的消息协议。您只需在工具->提琴手选项->连接中配置Fildder,使其性能类似于逃跑代理。
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)