2010-03-12 7 views
11

J'instancier l'objet HttpWebRequest:Utilisation de la classe HttpWebRequest

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

Quand je « post » les données à ce service, comment le service sait quelle méthode Web pour soumettre les données?

Je n'ai pas le code pour ce service web, tout ce que je sais, c'est qu'il a été écrit en Java.

Répondre

13

Cela devient un peu compliqué mais c'est parfaitement faisable.

Vous devez connaître le SOAPAction que vous voulez prendre. Si vous ne le faites pas, vous ne pouvez pas faire la demande. Si vous ne souhaitez pas configurer manuellement ce service, vous pouvez ajouter une référence de service à Visual Studio, mais vous devez connaître le point de terminaison des services.

Le code ci-dessous est pour une demande SOAP manuelle.

// 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 
+0

Je reçois une erreur lorsque j'essaie d'obtenir la réponse avec ce que vous avez écrit pour 'utiliser (HttpWebResponse response = (HttpWebResponse) request.GetResponse())', sur cette ligne.Y a-t-il un autre moyen d'obtenir la réponse? Dit pas connu, 'GetResponse()'. –

1

Différents moteurs de services Web acheminent différemment les requêtes entrantes vers des implémentations de services Web particulières.

Vous avez dit "services Web", mais vous n'avez pas spécifié l'utilisation de SOAP. Je vais supposer SOAP.

Le SOAP 1.1 specification dit ...

Le champ d'en-tête de requête HTTP SOAPAction peut être utilisé pour indiquer l'intention de la requête HTTP SOAP. La valeur est un URI identifiant l'intention. SOAP ne place aucune restriction sur le format ou la spécificité de l'URI ou qu'il est résolvable. Un client HTTP DOIT utiliser ce champ d'en-tête lors de l'émission d'une requête HTTP SOAP.

La plupart des moteurs de service Web sont conformes à la spécification, et donc utiliser l'en-tête SOAPAction:. Cela ne fonctionne évidemment qu'avec les transmissions SOAP-over-HTTP.

Lorsque HTTP n'est pas utilisé (par exemple, TCP ou un autre), le moteur de services Web doit se replier sur quelque chose. Beaucoup utilisent la charge utile du message, en particulier le nom de l'élément de niveau supérieur dans le fragment XML au sein du soap:envelope. Par exemple, le moteur pourrait regarder ce message entrant:

<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> 

... trouver l'élément GetAccountStatus, puis acheminer la demande sur cette base.

0

Si vous essayez de parler à un service Web Java, vous ne devez pas utiliser HttpWebRequest. Vous devez utiliser "Ajouter une référence de service" et le pointer vers le service Java.

+0

Ajout d'une référence de service est ce que je faisais, mais les en-têtes de sécurité WSE ne sont pas selon le goût du service java, iam avoir à construire les en-têtes manuellement, et donc je suis soumettre les données à l'aide HttpWebRequest . J'ai essayé d'utiliser "Assertions" mais cela n'a pas fonctionné pour moi (des problèmes sont apparus lors de la construction de certaines balises nécessaires dans l'en-tête de sécurité) – Developer

+0

@Nick: WSE n'a rien à voir avec "Add Service Reference". Comment WSE est-il impliqué? C'est obsolète et ne devrait pas être utilisé à moins que vous n'ayez d'autres choix. –