Si tout ce dont vous avez besoin, c'est d'un objet de communication WCF pour gérer les points d'extrémité RequestReply, la méthode suivante le fera pour vous.
Il prend un message de demande valide, un point d'arrivée et une action de savon et donne le xml brut qui a été retourné par le service.
Si vous voulez lui donner autre chose qu'un Message vous devrez mettre en œuvre une alternative pour IRequestChannel décoré des attributs ServiceContract et OperationContract.
// give it a valid request message, endpoint and soapaction
static string CallService(string xml, string endpoint, string soapaction)
{
string result = String.Empty;
var binding = new BasicHttpBinding();
// create a factory for a given binding and endpoint
using (var client = new ChannelFactory<IRequestChannel>(binding, endpoint))
{
var anyChannel = client.CreateChannel(); // Implements IRequestChannel
// create a soap message
var req = Message.CreateMessage(
MessageVersion.Soap11,
soapaction,
XDocument.Parse(xml).CreateReader());
// invoke the service
var response = anyChannel.Request(req);
// assume we're OK
if (!response.IsFault)
{
// get the body content of the reply
var content = response.GetReaderAtBodyContents();
// convert to string
var xdoc = XDocument.Load(content.ReadSubtree());
result = xdoc.ToString();
}
else
{
//throw or handle
throw new Exception("panic");
}
}
return result;
}
Pour utiliser la méthode ci-dessus, vous pouvez récupérer les deux paramètres dans le fichier de configuration ou utiliser des valeurs constantes :
var result = CallService(
@"<GetData xmlns=""http://tempuri.org/""><value>42</value></GetData>",
ConfigurationManager.AppSettings["serviceLink"],
ConfigurationManager.AppSettings["serviceSoapAction"]);
// example without using appSettings
var result2 = CallService(
@"<GetValues xmlns=""http://tempuri.org/""></GetValues>",
"http://localhost:58642/service.svc",
"http://tempuri.org/IService/GetValues");
Notez que vous n'aurez besoin d'aucune autre configuration dans votre fichier de configuration au-delà :
<appSettings>
<add key="serviceLink" value="http://localhost:58642/service.svc"/>
<add key="serviceSoapAction" value="http://tempuri.org/IService/GetData"/>
</appSettings>
Utilisez le WSDL du service pour déterminer la soapaction :
<wsdl:binding name="BasicHttpBinding_IService" type="tns:IService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="GetData">
<soap:operation soapAction="http://tempuri.org/IService/GetData" style="document"/>
et en suivant sa route à travers son portType et son message, vous trouverez les types :
<wsdl:types>
<xs:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://schemas.datacontract.org/2004/07/"/>
<xs:element name="GetData">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="value" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
à partir de laquelle vous pouvez construire la forme de la charge utile XML pour GetData :
<GetData xmlns="http://tempuri.org/">
<value>42</value>
</GetData>