web-dev-qa-db-fra.com

accéder à HttpContext.Current à partir du service Web WCF

Je viens de commencer à utiliser les services WCF avec ASP.NET AJAX. J'instancie mon service WCF à partir de Javascript, puis je passe des variables de chaîne comme arguments à ma méthode de service WCF (avec une signature OperationContract). Je retourne ensuite un objet .NET (défini avec un DataContract) qui est lié à ma classe Javascript personnalisée. J'ai des difficultés à m'authentifier en fonction de l'utilisateur connecté à ma session Web. Cependant, le service Web WCF est un service complètement différent sans contexte pour l'objet HttpContext.Current. Quel est le moyen le plus sûr d'accéder à cet objet?

30
MacGyver

Vous pouvez accéder à HttpContext.Current en activant AspNetCompatibility, de préférence via la configuration:

<configuration>
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>
</configuration>

Cela vous permet à son tour d'accéder à l'utilisateur actuel: HttpContext.Current.User - c'est ce que vous cherchez, non?

Vous pouvez même appliquer AspNetCompatibility en décorant votre classe de service avec un attribut supplémentaire:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

(Dans le System.ServiceModel.Activation namespace.) Si cet attribut est en place, votre service ne pourra pas démarrer à moins que AspNetCompatibility ne soit activé!

51
mthierba

Vous n'avez pas de HttpContext par défaut, mais vous avez plusieurs des mêmes objets présents dans OperationContext (qui est toujours présent) ou WebOperationContext (qui n'est disponible que pour certaines liaisons).

Vous pouvez accéder à OperationContext ou WebOperationContext en utilisant la propriété statique .Current Comme ceci: WebOperationContext.Current

26
faester

Si vous ne souhaitez pas modifier Web.config ou si vous ne pouvez pas le modifier:

private string GetClientIPAddress()
        {
            var props = OperationContext.Current.IncomingMessageProperties;
            var endpointProperty = props[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
            if (endpointProperty != null)
            {
                if (endpointProperty.Address == "::1" || String.IsNullOrEmpty(endpointProperty.Address))
                    return "127.0.0.1";

                return endpointProperty.Address;
            }

            return String.Empty;
        }
3
nikolai.serdiuk