J'essaie d'étendre la WCF afin que je puisse avoir un service Web reposant, dans lequel, pour chaque opération, j'effectue une vérification de l'en-tête HTTP Autorisation, dont la valeur que j'utilise pour appeler une méthode de connexion ().
Une fois le login terminé, je souhaite appeler la méthode correspondante de l'opération Vérification de la méthode correspondante du fonctionnement Si une exception de sécurité est lancée, auquel cas je répondrai avec un message "Accès refusé" personnalisé "à l'aide du code d'état HTTP approprié. p>
Dans cet esprit, j'ai pensé à mettre en œuvre un iendpointBehavior qui applique une implémentation d'ioperationInvoker à chaque opération (définir la propriété DispatTatchOverser.invoker) serait une bonne idée. P>
J'ai décidé de mettre en œuvre un IoperationInvoker à l'aide du modèle de conception de décorateur. Ma mise en œuvre aurait besoin d'une autre ioperationInvoker dans son constructeur sur lequel les invocations de méthodes seraient déléguées. P>
Ceci est mon ioperationInvokerimplement: p>
<services>
<service name="BookSmarTk.Web.Service.BookSmarTkService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/service"/>
</baseAddresses>
</host>
<endpoint
address=""
behaviorConfiguration="BookSmaTkEndpointBehavior"
binding="webHttpBinding"
bindingConfiguration="BookSmarTkBinding"
contract="BookSmarTk.Web.Service.BookSmarTkService">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name ="BookSmartkServiceBehavior">
<serviceDebug httpHelpPageEnabled="true" httpHelpPageUrl="/help.htm" includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="BookSmaTkEndpointBehavior">
<!--<webHttp/>-->
<bookSmarTkEndpointBehavior />
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="BookSmarTkBinding">
</binding>
</webHttpBinding>
</bindings>
<extensions>
<behaviorExtensions>
<add name="bookSmarTkEndpointBehavior" type="BookSmarTk.Web.Service.BookSmarTkEndpointBehaviorElement, BookSmarTk.Web.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
3 Réponses :
Je construis quelque chose de similaire (je pense - ne pas avoir le temps de regarder tout votre code), mais je suis allé à ce sujet d'une manière différente. P>
Pour y parvenir, j'utilise les éléments suivants: P>
au lieu de définir des invoqueurs sur ApplyDispatchbehavior (), vous devez créer un implémentation d'ioperationBehavior: , puis sur applyDispatchbehavior (), vous devez définir ce comportement: P> public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
foreach (var operation in endpoint.Contract.Operations) {
if (operation.Behaviors.Contains(typeof(MyOperationBehavior)))
continue;
operation.Behaviors.Add(new MyOperationBehavior());
}
}
Je sais que c'est très vieux, mais pour moi Réponse d'Alexey
travaillé. Cependant, uniquement lorsque la méthode AppelDispatchbehavour appelle la méthode de base. Comme ceci: