J'enveloppe un service Web ASMX existant avec une interface WCF en tant que phase de transition dans mon projet logiciel pour gagner du temps. Cela fonctionne bien, sauf pour une fonction qui renvoie un System.String.WCF a renvoyé System.IO.Stream brouillé
Le service ASMX original renvoyait du texte ou du code XML en fonction des paramètres donnés. Ce n'était pas un problème dans ASMX. Dans WCF, la valeur renvoyée, si XML, est échappée comme suit: <gml>
où elle doit être <gml>
. S'il vous plaît voir le SOAP ci-dessous.
Demande
POST http://someuri.org/WebServices/Utils.svc HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: http://www.someuri.org/IUtils/Function
Content-Length: 283
Accept: */*
User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5)
Host: foo.bar.org
Connection: Keep-Alive
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<Function xmlns="http://www.someri.org/">
<type>...</type>
<input1>...</input1>
<input2>...</input2>
<input3>true</input3>
</Function >
</s:Body>
</s:Envelope>
Réponse
HTTP/1.1 200 OK
Date: Fri, 04 May 2012 11:40:01 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Content-Length: 2070
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<FunctionResponse xmlns="http://www.crotec.nl/">
<FunctionResult><gml>data</gml></FunctionResult>
</FunctionResponse>
</s:Body>
</s:Envelope>
googling m'a amené à retourner un objet System.IO.Stream.
string result = DoStuff(arg1, arg2, arg3);
byte[] bin = Encoding.UTF8.GetBytes(result);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
return new System.IO.MemoryStream(bin);
Cela fonctionne dans une certaine mesure.
string result = "02010415DBD800D7E17577787A626978";
byte[] bin = {48,50,48,49,48,52,49,53,68,66,68,56,48,48,68,55,69,49,55,53,55,55,55,56,55,65,54,50,54,57,55,56};
Le résultat retourné dans le message SOAP est cependant:
MDIwMTA0MTVEQkQ4MDBEN0UxNzU3Nzc4N0E2MjY5Nzg=
Ainsi, la sortie résultante est brouillée (? Encore, je pense, causé par le codage des messages())
Le méthode est attr avec un de OperationContract et le service est hébergé dans IIS6 avec l'ABC suivante:
<service name="WebServices.BeheerUtils" behaviorConfiguration="Services.ServiceBehavior">
<!-- Service Endpoints -->
<endpoint address="" binding="basicHttpBinding" contract="WebServices.IUtils"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
Des idées pour lesquelles la sortie est brouillée ou comment empêcher l'encodage HTML?
Interface
[OperationContract]
System.IO.Stream Function(string type, string input1, string input2, string input3);
mise en œuvre
public new System.IO.Stream Function(string type, string input1, string input2, string input3)
{
// Call the old ASMX method
string result = DoStuff(type, input1, input2, input3, true);
byte[] bin = Encoding.UTF8.GetBytes(result);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
return new System.IO.MemoryStream(bin);
}
Le texte 'MDIwMTA0MTVEQkQ4MDBEN0UxNzU3Nzc4N0E2MjY5Nzg =' est la valeur encodée en base64 de '02010415DBD800D7E17577787A626978'. – empi
Pourriez-vous publier des détails sur votre interface de service WCF - au moins la définition de la méthode. Je ne comprends pas vraiment pourquoi en utilisant asmx vous pouvez retourner une chaîne ou xml et en utilisant WCF vous ne pouvez pas le faire (n'est pas xml juste une chaîne?). – empi
Merci pour la mise à jour, mais pourriez-vous répondre à ma deuxième question - pourquoi ne pouvez-vous pas simplement renvoyer la chaîne? – empi