Использование класса HttpWebRequest

Я создаю экземпляр объекта HttpWebRequest:

HttpWebRequest httpWebRequest = 
    WebRequest.Create("http://game.stop.com/webservice/services/gameup")
    as HttpWebRequest;

Когда я "отправляю" данные этой службе, как служба знает, какой веб-метод должен отправлять данные?

У меня нет кода для этого веб-сервиса, все, что я знаю, это то, что он был написан на Java.

Ответ 1

Это немного сложно, но это прекрасно.

Вы должны знать SOAPAction, который хотите принять. Если вы этого не сделаете, вы не можете сделать запрос. Если вы не хотите устанавливать это вручную, вы можете добавить ссылку на службу в Visual Studio, но вам нужно знать конечную точку службы.

Ниже приведен код для ручного запроса SOAP.

// load that XML that you want to post
// it doesn't have to load from an XML doc, this is just
// how we do it
XmlDocument doc = new XmlDocument();
doc.Load( Server.MapPath( "some_file.xml" ) );

// create the request to your URL
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( Your URL );

// add the headers
// the SOAPACtion determines what action the web service should use
// YOU MUST KNOW THIS and SET IT HERE
request.Headers.Add( "SOAPAction", YOUR SOAP ACTION );

// set the request type
// we user utf-8 but set the content type here
request.ContentType = "text/xml;charset=\"utf-8\"";
request.Accept = "text/xml";
request.Method = "POST";

// add our body to the request
Stream stream = request.GetRequestStream();
doc.Save( stream );
stream.Close();

// get the response back
using( HttpWebResponse response = (HttpWebResponse)request.GetResponse() )
{
     // do something with the response here
}//end using

Ответ 2

Различные механизмы веб-служб маршрутизируют входящие запросы к конкретным реализациям веб-сервисов по-разному.

Вы сказали "веб-службы", но не указали использование SOAP. Я собираюсь предположить SOAP.

спецификация SOAP 1.1 говорит...

Поле заголовка HTTP-запроса SOAPAction может использоваться для указания намерения HTTP-запроса SOAP. Значение - это URI, идентифицирующий намерение. SOAP не устанавливает ограничений на формат или специфичность URI или что он разрешимый. HTTP-клиент ДОЛЖЕН использовать это поле заголовка при выдаче HTTP-запроса SOAP.

Большинство движков веб-сервисов соответствуют спецификации и поэтому используют заголовок SOAPAction:. Очевидно, что это работает только с передачами SOAP-over-HTTP.

Когда HTTP не используется (скажем, TCP или какой-либо другой), движок веб-служб должен что-то отпадать. Многие используют полезную нагрузку сообщения, в частности имя элемента верхнего уровня в фрагменте XML в soap:envelope. Например, движок может посмотреть на это входящее сообщение:

<soap:Envelope
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
  soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <soap:Body>
       <m:GetAccountStatus xmlns:m="Some-URI">
           <acctnum>178263</acctnum>
       </m:GetAccountStatus>
   </soap:Body>
</soap:Envelope>

... найдите элемент GetAccountStatus, а затем направьте запрос на основе этого.

Ответ 3

Если вы пытаетесь поговорить с веб-службой Java, вам не следует использовать HttpWebRequest. Вы должны использовать "Добавить ссылку на службу" и указать ее на службу Java.