Essayer de faire appel à un service WCF avec un WebRequest
J'ai un service WCF qui doit être appelé par une 3ème partie application, la publication de certains XML brut.
Je suis en train de tester mon service par la construction d'une simple WebRequest et de faire la demande pour le service.
Voici mon code de service:
Interface:
[ServiceContract(Namespace = "http://test.mydomain.com")]
public interface ITest
{
[WebInvoke(UriTemplate = "", BodyStyle = WebMessageBodyStyle.Bare, Method="POST")]
[OperationContract]
Stream SaveXML(Stream input);
}
Service:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(Namespace = "http://test.mydomain.com")]
public class Test : ITest
{
public Stream SaveXML(Stream input)
{
StreamReader streamReader = new StreamReader(input);
string rawString = streamReader.ReadToEnd();
streamReader.Dispose();
//here need to save the input stream to xml format file
Encoding encoding = Encoding.GetEncoding("ISO-8859-1");
WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
byte[] returnBytes = encoding.GetBytes(rawString);
return new MemoryStream(returnBytes);
}
}
config:
<services>
<service behaviorConfiguration="Blah.TestBehavior" name="Blah.Test">
<endpoint address="http://localhost:51494/Blah/Test.svc" binding="basicHttpBinding" contract="Blah.ITest">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
défectueux code client:
string postData = "<Message version=\"1.5\" xmlns=\"http://test.mydomain.com\" ><books>Blah</books></Message>";
WebRequest request = WebRequest.Create("http://localhost:51494/Blah/Test.svc/SaveXML");
request.Method = "POST";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
//request.ContentType = "text/xml; charset=utf-8";
//request.ContentType = "text/xml;";
//request.ContentType = "application/xml;";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
//Get the response.
WebResponse response = request.GetResponse();
Sur cette dernière ligne, je reçois un 400 (Bad Request) ou 415 (Unsupported Media Type d'erreur, en fonction de la ContentType je précise.
Aussi, si je peux ajouter une référence de service dans mon application client, et appeler le service à l'aide de l'API, il fonctionne très bien. Toutes les suggestions seraient grandement appréciés, comme je suis nouveau sur WCF et complètement perplexe.
- Ce que je voudrais faire: utiliser Fiddler fiddler2.com/fiddler2 pour voir la demande de "l'API" - l'un qui fonctionne. Puis de le comparer à la requête qui ne fonctionne pas. Qui devrait le réduire.
- Votre
StreamReader
doit être dans unusing
bloc, comme le font plusieurs de vos autres objets. Unusing
bloc va les amener à être éliminés, même si une exception est levée.
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez mélangé deux choses différentes ici:
WebRequest
et unPOST
et la[WebInvoke]
attribut suggère que vous essayez de faire quelque chose comme le RESTEbasicHttpBinding
- un protocole SOAP qui ne sera pas voler avecWebRequest
Soi - faites de votre esprit!
Voulez-vous utiliser du SAVON? Alors vous êtes très bien avec le basicHttpBinding comme il est, mais vous ne pouvez pas accéder à un service SOAP juste comme ça à partir d'un WebRequest avec la POSTE - vous avez besoin d'utiliser le client SOAP généré par Visual Studio ou
svcutil.exe
sur la ligne de commande.Voulez-vous utiliser WebRequest et une simple requête POST?? Ensuite, vous devez créer un REST service WCF - utiliser le
webHttpBinding
et laWebServiceHost
(par opposition à une simple ServiceHost).Pour le SAVON à base de services WCF, découvrez la WCF Developer Center sur MSDN.
Pour le RESTE basée sur des services WCF (qui vous permet de naviguer dans votre navigateur, et que vous pouvez appeler à partir de WebRequest), découvrez la WCF REST Developer Center sur MSDN et avoir un coup d'oeil à l'excellent série de screencasts par Pluralsight RESTE basé sur le développement dans WCF, notamment:
basicHttpBinding est également adapté!
Je passe près d'un jour de trouver de quoi de mal avec WebRequest de service WCF avec basicHttpBinding et il s'est avéré que j'ai manqué petit mais essentiel: SOAPAction en-tête doit être réglé!
WebRequest
. Procédé SOAPHeaders ainsi.