2014-10-23 6 views
0

웹 서비스에 간단한 XML SOAP 요청을 만들려고합니다..NET SOAP 요청에서 "400 Bad Request"를 반환합니다.

서비스 자체는 문제가없는 것으로 확인되었으므로 아무 문제없이 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; 
    } 
} 

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 : 제 서비스에서 제 3 자로 서비스 변경 : http://wsf.cdyne.com/WeatherWS/Weather.asmx WSDL을 통해 작동합니다. SoapUI는 데이터를 반환합니다. 내 코드에서 - 내부 오류 500

+0

WSDL에서 생성 된 프록시를 통해 서비스를 호출 할 수 있다면 - 왜 그렇게하지 않습니까? HttpWebRequest를 통해이 작업을 수행해야하는 경우 Fiddler 또는 무언가를 사용하여 무언가를 보내고 있는지 확인해야합니다. 이는 soapUI가 보내는 것과 비교하십시오. 마지막으로 LINQ to XML 또는 기타 XML 기반 API를 사용하여 XML을 만드는 습관을 익히십시오. 이러한 API는 XML 규칙을 알고 있습니다. 문자열은 XML 규칙을 모릅니다. 잘못된 XML로 인해 400 오류가 발생할 수 있습니다. –

+0

내 생각 엔 BOM을'soapEnvelopeXml.Save' 호출로 작성하고있는 것 같습니다. Fiddler (또는 선택한 HTTP 디버거)를 사용하여 사용자와 SoapUI 요청을 비교하여 확인하십시오. –

+0

나도 알아,하지만 난 그냥 XML 문자열을 사용하여 SOAP 요청을 처리한다는 개념 증명을 만들었다. – Ilya

답변

0

은 나에게 매우 도움이되었다, 바이올린 켜는 사람과 발송에 실패 HTTP 요청을 확인 작동하지 않을 경우 SOAP 메시지 .Replace("\r\n", ""); 에서 캐리지 리턴을 제거하십시오.

+0

모든 XML을 한 줄에 입력하십시오. SoapEnvelopeXml.LoadXml ( " " 변경된 내용 없음 – Ilya

+0

Fiddler가 localhost에 대한 SOAP 호출을 차단하지 못함 이유 - 잘 모르겠 음 – Ilya

+0

Fiddler가 모든 http 메시지를 가로 채고, SOAP는 HTTP에 사용되는 메시지 프로토콜로, Tools-> Fiddler OPtions-> Connections에서 도망 프록시처럼 수행하도록 Fildder를 구성하면됩니다. –

관련 문제