10
votes

Quand et où définir une ioperation personnalisée?

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>

wcf

0 commentaires

3 Réponses :


2
votes

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.

Pour y parvenir, j'utilise les éléments suivants:

  • Un imessageinSpector Pour lire les en-têtes de message HTTP entrants (dans ce cas, extraire une carte d'identité d'un cookie et récupérer un objet de session à partir d'une cache).
  • Une combinaison d'un iprincipal et d'une iauthorizationPolicyPolicy pour mettre en œuvre mon propre code d'autorisation personnalisé (WCF invoquera automatiquement mon code pour les demandes de méthodes de service Web qui ont l'attribut '[Principalpermission (SecurityACtAction.Demand, Rôle = "Somerole")] 'Ensemble).
  • Un iErrorhandler qui attrape toutes les exceptions non capturées des méthodes de service Web (y compris une permission refusée d'exception si une autorisation échoue - c'est-à-dire la méthode de l'isrole que vous implémentez dans le renvoi Iprincipal False). Si vous attrapez l'exception refusée de la sécurité, vous pouvez ensuite utiliser weboPerationContext.Current pour définir les codes d'erreur HTTP personnalisés pour le message de réponse.
  • Un comportement personnalisé (un icontractbehavior - mais vous pouvez également utiliser un comportement de terminaison ou de service ou tout ce que vous voulez), ce qui crée tout ce qui précède à l'exécution et les attache aux points d'extrémité appropriés.

0 commentaires

12
votes

au lieu de définir des invoqueurs sur ApplyDispatchbehavior (), vous devez créer un implémentation d'ioperationBehavior: xxx pré>

, 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());
   }
  }


0 commentaires

1
votes

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: xxx


0 commentaires