<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>c2i.fr - WCF</title><link>http://www.c2i.fr:80/Tags/WCF</link><description>c2i.fr - WCF</description><item><title>WCF Data Services 5.0 pour OData v3 est disponible</title><link>http://www.c2i.fr:80/actualites/wcf-data-services-5.0-pour-odata-v3-est-disponible</link><description>&lt;p&gt;Gr&amp;acirc;ce &amp;agrave; cette extension, vous allez pouvoir cr&amp;eacute;er et consommer des services WCF au format OData v3.0.&lt;/p&gt;
&lt;p&gt;Elle supporte :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les actions (&lt;a href="http://www.odata.org/blog/2011/10/7/actions-in-odata"&gt;voir sur le site des odata.org ce que sont les actions&lt;/a&gt;),&amp;nbsp;&lt;/li&gt;
&lt;li&gt;des primitives spaciales (comme des lignes, coordonn&amp;eacute;es, etc.),&amp;nbsp;&lt;/li&gt;
&lt;li&gt;inclus ODataLib .NET (s&amp;eacute;rialiseur/d&amp;eacute;s&amp;eacute;rialiseur OData),&amp;nbsp;&lt;/li&gt;
&lt;li&gt;inclus EdmLib (mod&amp;eacute;lisation Entity Data)&lt;/li&gt;
&lt;li&gt;diverses autres fonctionnalit&amp;eacute;s&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elle inclut &amp;eacute;galement une version pour Silverlight.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/b/astoriateam/archive/2012/04/09/wcf-data-services-5-0-rtm-release.aspx"&gt;L'annonce sur le blog MSDN.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.microsoft.com/downloads/fr-fr/details.aspx?familyid=5b1a903e-59e2-46e8-b63b-a9421bbb6bf9"&gt;T&amp;eacute;l&amp;eacute;chargement.&lt;/a&gt;&lt;/p&gt;</description><pubDate>Tue, 10 Apr 2012 06:19:21 GMT</pubDate><guid isPermaLink="true">http://www.c2i.fr:80/actualites/wcf-data-services-5.0-pour-odata-v3-est-disponible</guid></item><item><title>Comment loguer les flux soap d'un client WCF ?</title><link>http://www.c2i.fr:80/articles/comment-loguer-les-flux-soap-d-rsquo-un-client-wcf</link><description>&lt;p&gt;Imaginons que vous ayez un client qui doit consommer un web service. Avec Visual Studio, rien de plus simple, il suffit d&amp;rsquo;ajouter une r&amp;eacute;f&amp;eacute;rence de service pour que tout le code soit g&amp;eacute;n&amp;eacute;r&amp;eacute; pour vous.&lt;/p&gt;
&lt;p&gt;Mais si vous &amp;ecirc;tes dans un environnement &amp;ldquo;professionnel&amp;rdquo;, il est n&amp;eacute;cessaire, obligatoire, de pouvoir loguer les &amp;eacute;changes entre le client et le serveur.&lt;/p&gt;
&lt;p&gt;Or par d&amp;eacute;finition, comme svcutil.exe vous a g&amp;eacute;n&amp;eacute;r&amp;eacute; les classes/objets qu&amp;rsquo;il faut, vous ne manipuler que des objets, jamais les flux Xml qui sont s&amp;eacute;rialis&amp;eacute;s et d&amp;eacute;s&amp;eacute;rialis&amp;eacute;s par les classes du framework.&lt;/p&gt;
&lt;p&gt;Or si vous avez un probl&amp;egrave;me d&amp;rsquo;&amp;eacute;change avec le serveur, il y a de forte chance que le responsable du serveur vous demande :&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Tu m&amp;rsquo;as envoy&amp;eacute; quoi comme message xml ? Et tu as re&amp;ccedil;u quoi ?&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Et l&amp;agrave; : c&amp;rsquo;est le drame ! &lt;img style="border-style: none;" class="wlEmoticon wlEmoticon-winkingsmile" alt="Clignement d'&amp;oelig;il" src="http://178.170.116.92/Media/Default/Windows-Live-Writer/9682c1372fe9_FB69/wlEmoticon-winkingsmile_2.png" /&gt;&lt;/p&gt;
&lt;p&gt;Car il n&amp;rsquo;y a rien qui vous permet d&amp;rsquo;acc&amp;eacute;der &amp;agrave; cette information, du moins de fa&amp;ccedil;on trivial.&lt;/p&gt;
&lt;p&gt;Avec les WebServices de l&amp;rsquo;ancien temps (ie pas sous WCF, les WebServices qui sont apparus avec le framework 1.0 quoi), vous deviez cr&amp;eacute;er une classe d&amp;eacute;rivant&amp;nbsp; de SoapExtension et sa m&amp;eacute;thode ProcessMessage &amp;eacute;tait appel&amp;eacute;e &amp;agrave; chaque &amp;eacute;tape du process (ie avant/apr&amp;egrave;s envoi du message et avant/apr&amp;egrave;s r&amp;eacute;ception du message. (&lt;a href="http://blog.encoresystems.net/articles/how-to-capture-soap-envelopes-when-consuming-a-web-service.aspx" target="_blank"&gt;voir un article que j&amp;rsquo;ai trouv&amp;eacute; qui est tr&amp;egrave;s bien fait&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Mais ce n&amp;rsquo;&amp;eacute;tait franchement pas tr&amp;egrave;s pratique car vous ne pouviez, dans le code utilisant le client du webservice, modifier/acc&amp;eacute;der &amp;agrave; l&amp;rsquo;objet d&amp;eacute;rivant de SoapExtension.&lt;/p&gt;
&lt;p&gt;Pour nous, avec WCF, c&amp;rsquo;est plus simple (enfin presque).&lt;/p&gt;
&lt;h1&gt;IClientMessageInspector&lt;/h1&gt;
&lt;p&gt;Le principe est dans un premier temps de cr&amp;eacute;er une classe qui h&amp;eacute;rite de System.ServiceModel.Dispatcher.IClientMessageInspector (dans System.ServiceModel). On doit juste d&amp;eacute;finir 2 m&amp;eacute;thodes qui sont appel&amp;eacute;es &amp;agrave; l&amp;rsquo;envoi et &amp;agrave; la r&amp;eacute;ception du message :&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;public class MyMessageInspector : IClientMessageInspector
{
    #region Implementation of IClientMessageInspector

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        XmlRequest = request.ToString();
        return null;
    }

    public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        XmlResponse = reply.ToString();
    }

    #endregion

    /// &amp;lt;summary&amp;gt;
    /// Xml envoy&amp;eacute;
    /// &amp;lt;/summary&amp;gt;
    public string XmlRequest { get; set; }

    /// &amp;lt;summary&amp;gt;
    /// Xml re&amp;ccedil;u
    /// &amp;lt;/summary&amp;gt;
    public string XmlResponse { get; set; }
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Rien de compliqu&amp;eacute; vous l&amp;rsquo;avouerez. Attention &amp;agrave; une chose importante : si vous voulez vous amuser avec le message (le modifier par exemple), ne travaillez jamais avec le message lui m&amp;ecirc;me mais avec une copie. Heureusement, il y a des outils pour cela :&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;var buffer = request.CreateBufferedCopy(int.MaxValue);
var message = buffer.CreateMessage();
// on s'amuse ici
buffer.Close();
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Notre IClientMessageInspector permet donc de stocker les flux entrant sortant. Il faut maintenant le lier avec notre client.&lt;/p&gt;
&lt;p&gt;Pour cela, on a la possibilit&amp;eacute; d&amp;rsquo;ajouter un behavior (comportement) &amp;agrave; notre service. Ce behavior fera le lien entre notre classe IClientMessageInspector et notre client du service.&lt;/p&gt;
&lt;h1&gt;IEndpointBehavior&lt;/h1&gt;
&lt;p&gt;Nous allons donc cr&amp;eacute;er une classe impl&amp;eacute;mentant l&amp;rsquo;interface IEndpointBehavior. Sa seule fonctionnalit&amp;eacute; sera d&amp;rsquo;ajouter notre IClientMessageInspector &amp;agrave; la liste des Inspector de notre service. Son code est donc tr&amp;egrave;s simple :&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;public class MyEndpointBehavior : IEndpointBehavior
{
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {}

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        // instanciation de l'inspector
        Inspector = new MyMessageInspector();
        // ajout de l'inspector pour notre service
        clientRuntime.MessageInspectors.Add(Inspector);
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {}

    public void Validate(ServiceEndpoint endpoint)
    {}

    /// &amp;lt;summary&amp;gt;
    /// L'inspector
    /// &amp;lt;/summary&amp;gt;
    public MyMessageInspector Inspector { get; set; }
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Il ne nous reste plus qu&amp;rsquo;&amp;agrave; ajouter le comportement (behavior) aux comportements de notre service.&lt;/p&gt;
&lt;h1&gt;Param&amp;eacute;trage du service&lt;/h1&gt;
&lt;p&gt;Pour param&amp;eacute;trer un service, il y a 2 options :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Soit vous vous amusez &amp;agrave; &amp;eacute;crire des centaines de lignes dans le fichier de configuration de votre application,&lt;/li&gt;
&lt;li&gt;Soit vous ajoutez des centaines de lignes de codes au moment de l&amp;rsquo;instanciation de votre service.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personnellement, je pr&amp;eacute;f&amp;egrave;re la seconde solution (mais cela n&amp;rsquo;engage que moi). Donc vous aurez un code du genre :&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;var binding = new BasicHttpBinding();

binding.ReceiveTimeout = new TimeSpan(0, 5, 0);
binding.SendTimeout = new TimeSpan(0, 5, 0);

binding.CloseTimeout = new TimeSpan(0, 5, 0);
binding.OpenTimeout = new TimeSpan(0, 5, 0);

binding.MaxReceivedMessageSize = Int32.MaxValue;
binding.MaxBufferSize = Int32.MaxValue;

binding.ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
binding.ReaderQuotas.MaxArrayLength = Int32.MaxValue;
binding.ReaderQuotas.MaxNameTableCharCount = Int32.MaxValue;

binding.Security.Mode = BasicHttpSecurityMode.None;
// ServiceUrl est une propri&amp;eacute;t&amp;eacute; qui indique l'adresse du service
_client = new MyServiceClient(binding, new EndpointAddress(ServiceUrl));
_client.Endpoint.Behaviors.Add(new MyEndpointBehavior());
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Il suffit maintenant, juste apr&amp;egrave;s l&amp;rsquo;utilisation de la m&amp;eacute;thode du service, de r&amp;eacute;cup&amp;eacute;rer les flux xml envoy&amp;eacute;s/r&amp;eacute;ceptionn&amp;eacute;s en retrouvant notre comportement :&lt;/p&gt;
&lt;pre class="brush: csharp;"&gt;var response = _client.MethodeDuService(argumentsDuService);

var myEndpointBehavior = _client.Endpoint.Behaviors.OfType&amp;lt;MyEndpointBehavior&amp;gt;().FirstOrDefault();
if (myEndpointBehavior != null)
{
    XmlRequest = myEndpointBehavior.Inspector.XmlRequest;
    XmlResponse = myEndpointBehavior.Inspector.XmlResponse;
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Et voila.&lt;/p&gt;
&lt;p&gt;Si vous avez des commentaires &amp;agrave; faire, n&amp;rsquo;h&amp;eacute;sitez pas.&lt;/p&gt;</description><pubDate>Thu, 02 Feb 2012 21:44:05 GMT</pubDate><guid isPermaLink="true">http://www.c2i.fr:80/articles/comment-loguer-les-flux-soap-d-rsquo-un-client-wcf</guid></item></channel></rss>