web-dev-qa-db-fra.com

Comment appeler un service Web à partir de C # avec HTTP POST

Je souhaite écrire une classe c # permettant de créer une connexion à un service Web exécuté sur www.temp.com, envoyer 2 paramètres de chaîne à la méthode DoSomething et obtenir le résultat de la chaîne . Je ne souhaite pas utiliser wsdl Étant donné que je connais les paramètres du service Web, je souhaite simplement passer un appel simple.

Je suppose qu’il devrait exister un moyen simple et facile de le faire dans .Net 2, mais je n’ai trouvé aucun exemple ...

18
Stavros

Si ce "service Web" est un simple HTTP GET, vous pouvez utiliser WebRequest :

WebRequest request = WebRequest.Create("http://www.temp.com/?param1=x&param2=y");
request.Method="GET";
WebResponse response = request.GetResponse();

À partir de là, vous pouvez regarder response.GetResponseStream pour la sortie. Vous pouvez utiliser un service POST de la même manière.

Toutefois, s’il s’agit d’un service Web SOAP, ce n’est pas aussi simple. En fonction de la sécurité et des options du service Web, vous pouvez parfois utiliser une requête déjà formée et l'utiliser comme modèle - remplacez les valeurs param et envoyez-la (à l'aide d'une requête électronique), puis analysez la réponse SOAP manuellement ... mais dans ce cas, vous cherchez beaucoup de travail supplémentaire et vous pouvez simplement utiliser wsdl.exe pour générer des procurations.

22
Philip Rieck

Je voudrais utiliser ASP.NET MVC pour votre service Web. Vous pouvez fournir des paramètres via les paramètres de formulaire standard et renvoyer le résultat au format JSON.

[HttpPost]
public ActionResult MyPostAction( string foo, string bar )
{
     ...
     return Json( new { Value = "baz" } );
}

Dans votre client, utilisez le HttpWebRequest

var request = WebRequest.Create( "/controller/mypostaction" );
request.Method = "POST";
var data = string.Format( "foo={0}&bar={1}", foo, bar );
using (var writer = new StreamWriter( request.GetRequestStream() ))
{
    writer.WriteLine( data );
}
var response = request.GetResponse();
var serializer = new DataContractJsonSerializer(typeof(PostActionResult));
var result = serializer.ReadObject( response.GetResponseStream() )
                 as PostActionResult;

où tu as

public class PostActionResult
{
     public string Value { get; set; }
}
11
tvanfosson

Une autre façon d’appeler la méthode POST, j’appelais la méthode POST dans WebAPI.

            WebClient wc = new WebClient();

            string result;
            wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            result = wc.UploadString("http://localhost:23369/MyController/PostMethodName/Param 1/Param 2","");

            Response.Write(result);
3
Prateek-Systematix

Vous pouvez retourner l'objet List en utilisant Newtonsoft.Json:

WebClient wc = new WebClient();
  string result;
  wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
  var data = string.Format("Value1={0}&Value2={1}&Value3={2}", "param1", "param2", "param3");
  result = wc.UploadString("http:your_services", data);
  var ser = new JavaScriptSerializer();
  var people = ser.Deserialize<object_your[]>(result);
1
Tran Anh Hien