Как отправить/получить запрос и ответ SOAP с помощью С#?
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>
Edit:
Я обновил код выше в WebServiceCall, который работал для службы .asmx. Но тот же код не работал для службы WCF. Почему?
Ответы
Ответ 1
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
против.
-
http://tempuri.org/GetMyName
Вы должны иметь возможность определить правильное SOAPAction, перейдя на правильный URL ASMX и добавив ?wsdl
Для тега <wsdl:operation>
должен быть тег <soap:operation>
, который соответствует операции, которую вы пытаетесь выполнить, которая выглядит как GetMyName
.
В тело запроса отсутствует XML-объявление, которое содержит ваш SOAP-XML.
Вы указываете text/xml
в ContentType вашего HttpRequest и без кодировки. Возможно, это значение по умолчанию - us-ascii
, но там не указано, не указали ли вы их!
Созданный SoapUI XML содержит объявление XML, которое указывает кодировку utf-8, которая также соответствует Content-Type, предоставленному HTTP-запросу, который: text/xml; charset=utf-8
Надеюсь, что это поможет!