2010-11-11 14 views
2

Je suis nouveau dans les services reposants et j'ai créé une série d'applications console simples pour mieux comprendre. J'ai un service simlple que j'essaye d'envoyer des données mais j'obtiens toujours une erreur 400 de demande mauvaise. Je sais que ça doit être quelque chose de simple que j'ai oublié. Toute aide serait grandement appréciée. MerciAide avec un simple problème de poste de repos

//service contract 
[OperationContract, WebInvoke(Method = "POST", UriTemplate = "Test")] 
bool Test(string input); 

//service 
public bool Test(string input) 
{ 
    Console.Out.WriteLine("recieved [" + input + "]"); 
    return true; 
} 

//host program 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Uri baseAddress = new Uri("http://localhost:8889/TestImage"); 
     WebServiceHost host = new WebServiceHost(typeof(ImageTestService), baseAddress); 

     try 
     { 
      host.Open(); 

      Console.Out.WriteLine("TestService hosted at {0}", baseAddress.ToString()); 
      Console.Out.WriteLine("hit enter to terminate"); 
      Console.In.ReadLine(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      Console.ReadKey(); 
     } 
     finally 
     { 
      if (host.State == CommunicationState.Faulted) 
       host.Abort(); 
      else 
       host.Close(); 
     } 
    } 
} 

//client program 
// Create the web request 
Uri address = new Uri("http://localhost:8889/TestImage/Test"); 
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; 

// Set type to POST 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 

StringBuilder data = new StringBuilder(); 
data.Append("input=" + HttpUtility.UrlEncode("12345")); 

// Create a byte array of the data we want to send 
byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); 

// Set the content length in the request headers 
request.ContentLength = byteData.Length; 

// Write data 
using (Stream postStream = request.GetRequestStream()) 
{ 
    postStream.Write(byteData, 0, byteData.Length); 
    postStream.Close(); 
} 

// Get response 
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
{ 
    // Get the response stream 
    StreamReader reader = new StreamReader(response.GetResponseStream()); 
} 

Répondre

0

Je ne sais pas qui est répond à votre question - mais j'ai une méthode d'extension que j'utilise pour la forme post:

public static HttpWebResponse DoFormPost(this HttpWebRequest request, string postVals, int timeoutSeconds) 
    { 
     request.Method = "POST"; 
     request.Timeout = timeoutSeconds * 0x3e8; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.AllowAutoRedirect = false; 
     byte[] bytes = Encoding.UTF8.GetBytes(postVals); 
     request.ContentLength = bytes.Length; 
     using (Stream stream = request.GetRequestStream()) 
     { 
      stream.Write(bytes, 0, bytes.Length); 
     } 
     return (HttpWebResponse)request.GetResponse(); 
    } 

Ou depuis que vous avez taguée WCF, puis il y a aussi une autre question similaire :

Getting an http 400 error on calling a restful wcf service using http post

0

Malheureusement, je ne suis pas sûr de ce qui ne va pas avec votre code, il semble bien à première vue. Je me demande si c'est UriTemplate que vous utilisez. Si votre méthode est « Test » et le UriTemplate est « Test », vous devrez peut-être appeler avec cette URL (deux chaînes « Test »):

Uri address = new Uri("http://localhost:8889/TestImage/Test/Test"); 

je crois que le nom de la méthode fait partie de l'URL par par défaut, le modèle est appliqué après cela. Avec les erreurs HTTP, j'utilise un outil appelé Fiddler pour résoudre les problèmes. Si vous pouvez créer une requête qui fonctionne avec le Générateur de requêtes, il s'agit simplement de savoir comment produire cette requête via votre code.

+0

Merci pour votre response.I essayé votre suggestion et a ajouté une autre « test » à l'URL, mais je suis arrivé un 404. J'ai installé Fiddler et je peux voir ce que j'envoie au service mais tout me semble bien. Si la méthode du serveur a un argument nommé "input" dois-je inclure le parem naem dans la chaîne de post ou est-ce que je le fais seulement si le nom de parm est dans le modèle d'URL? – user503926

0

Le service WCF que vous appelez attend la sérialisation de la chaîne que vous transmettez en XML!

Ce qui suit a travaillé pour moi dans le passé:

string body = "foo"; 
string postData = @"<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/'><![CDATA[" + body + "]]></string>";