Как отправить / получить SOAP-запрос и ответ с помощью C #? - PullRequest
22 голосов
/ 22 марта 2011
private static string WebServiceCall(string methodName)        
{
    WebRequest webRequest = WebRequest.Create("http://localhost/AccountSvc/DataInquiry.asmx");
    HttpWebRequest httpRequest = (HttpWebRequest)webRequest;             
    httpRequest.Method = "POST";             
    httpRequest.ContentType = "text/xml; charset=utf-8";
    httpRequest.Headers.Add("SOAPAction: http://tempuri.org/" + methodName);
    httpRequest.ProtocolVersion = HttpVersion.Version11;
    httpRequest.Credentials = CredentialCache.DefaultCredentials;
    Stream requestStream = httpRequest.GetRequestStream();              
    //Create Stream and Complete Request             
    StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.ASCII);

    StringBuilder soapRequest = new StringBuilder("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
    soapRequest.Append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ");
    soapRequest.Append("xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>");
    soapRequest.Append("<GetMyName xmlns=\"http://tempuri.org/\"><name>Sam</name></GetMyName>");
    soapRequest.Append("</soap:Body></soap:Envelope>");

    streamWriter.Write(soapRequest.ToString());             
    streamWriter.Close();              
    //Get the Response    
    HttpWebResponse wr = (HttpWebResponse)httpRequest.GetResponse();
    StreamReader srd = new StreamReader(wr.GetResponseStream()); 
    string resulXmlFromWebService = srd.ReadToEnd(); 
    return resulXmlFromWebService;
}

Я пытался использовать другой код для отправки / получения мыльных ответов, но все они не работают с одним и тем же "The remote server returned an error: (500) Internal Server Error.".

Я могу получить доступ к одной и той же службе с помощью SoapUI.Я тоже могу вызывать метод.Я прочитал на этом форуме, что причина, по которой я получаю ошибку 500, может быть неправильным заголовком.Я проверил заголовок, кажется, все в порядке.Я был бы признателен, если кто-то может помочь.

Ниже приведен пример запроса SOAP:

POST /AccountSvc/DataInquiry.asmx HTTP/1.1
Host: abc.def.gh.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/GetMyName"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetMyName xmlns="http://tempuri.org/">
      <name>string</name>
    </GetMyName>
  </soap:Body>
</soap:Envelope>

Я использовал приведенный выше пример запроса для выполнения метода, и он работал.Вот запрос Soap, который я передал:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetMyName xmlns="http://tempuri.org/"><name>Sam</name></GetMyName></soap:Body></soap:Envelope>

Редактировать:

Я обновил приведенный выше код в WebServiceCall, который работал для службы .asmx.Но тот же код не работал для службы WCF.Почему?

1 Ответ

21 голосов
/ 23 марта 2011

URL-адреса разные.

  • http://localhost/AccountSvc/DataInquiry.asmx

против

  • /acctinqsvc/portfolioinquiry.asmx

Сначала решите эту проблему, так как если веб-сервер не может разрешить URL-адрес, на который вы пытаетесь выполнить POST, вы даже не начнете обрабатывать действия, описанные в вашем запросе.

Вам нужно всего лишь создать WebRequest для корневого URL-адреса ASMX, например: http://localhost/AccountSvc/DataInquiry.asmx, и указать нужный метод / операцию в заголовке SOAPAction.

Значения заголовка SOAPAction отличаются.

  • http://localhost/AccountSvc/DataInquiry.asmx/ + methodName

против

Вы сможете определить правильный SOAPAction, перейдя по правильному URL-адресу ASMX и добавив ?wsdl

Под тегом <wsdl:operation> должен быть тег <soap:operation>, соответствующий операции, которую вы пытаетесь выполнить, которая выглядит как GetMyName.

В теле запроса нет объявления XML, включающего ваш SOAP XML.

Вы указываете text/xml в ContentType вашего HttpRequest, а не кодировку. Возможно, это значение по умолчанию us-ascii, но невозможно сказать, не указали ли вы их!

XML, созданный SoapUI, включает в себя объявление XML, которое задает кодировку utf-8, которая также соответствует типу содержимого, предоставленному для HTTP-запроса: text/xml; charset=utf-8

Надеюсь, это поможет!

...