12
votes

Comment définir ServiceHostingenvironment.aspnetcompatibilityEnabled = True in Code (pas dans Config) .NET / C #

J'ai une condition d'accéder à httpcontext.current à partir d'un service WCF reposant. Je sais que je suis capable de y parvenir en ajoutant ce qui suit à CONFIG:

string serviceUrl = "http://localhost:8082/MyService.svc";

_host = new ServiceHost(typeof(MyService), new Uri[] { new Uri(serviceUrl) });

ServiceEndpoint serviceEndpoint 
    = _host.AddServiceEndpoint(typeof(IMyService), new WebHttpBinding(), string.Empty);

serviceEndpoint.Behaviors.Add(new WebHttpBehavior());

// Here's where I'm stuck, i need something like...
ServiceHostingEnvironmentSection shes = new ServiceHostingEnvironmentSection();
shes.AspNetCompatibilityEnabled = true;
_host.Add(shes);

_host.Open();


0 commentaires

5 Réponses :


0
votes

C'est un paramètre AppDomain à l'échelle que vous pouvez définir sur la classe STATIC SERVICEHOSTINGENVIRONMENT CODE> System.ServiceModel: Strike>

 ServiceHostingEnvironment.AspNetCompatibilityEnabled = true;


4 commentaires

Malheureusement, cette propriété n'a pas de réglage.


Y a-t-il une solution de contournement pour cela? C'est incroyable que vous puissiez facilement configurer complètement WCF par programme à l'exception de ce cas particulier. J'appellerais cela un bug dans WCF. Y a-t-il un moyen de dire au moins à votre service de le faire pour vous?


@marc_s: Tout ce que vous avez à faire est de définir le service-usine (voir ma réponse), cependant que ce n'est pas un site à l'échelle du site.


La réponse précitée ne montre pas comment définir cette valeur spécifique par programme.



-3
votes

Envisagez de saisir l'utilisation explicite de httpcontext.Current derrière une interface que vous pouvez assouper lors des tests unitaires.

httpcontext.current est uniquement défini lorsque votre service WCF est hébergé dans une application Web ASP.NET quand même - si un jour, vous devez l'héberger comme service WCF ordinaire, httpcontext.current ne sera pas disponible.


1 commentaires

Cela ne touche même même pas comment définir l'ASPnetCompatibilittibilitéDenabled, ce que 95% de sa question concernait.



5
votes

Vous pouvez totalement faire cela, je ne sais pas ce que ces autres réponses sont à peu près, mais elles sont bien désactivées!

juste faire quelque chose comme: xxx

-- Éditer Cela supprime le comportement existant s'il existe, puis ajoute un nouveau comportement qui a le mode que vous préférez. Mon exemple le définit à .Allip, mais vous pouvez bien sûr le régler au mode que vous désirez.


6 commentaires

Cela vient de définir si le service lui-même nécessite une compatibilité ASPnet et non l'hôte.


Comment cela définira-t-il la propriété aspnetCompatibilityenabled sur true?


Cela ne change pas le paramètre d'environnement d'hébergement, ne modifie que la valeur indiquant ce que le service nécessite.


@Mattes Vous réalisez que cette question est de 10 ans non? Cette réponse résout le problème posté par l'OP. Si vous essayez de faire quelque chose de différent, cela ne fonctionne pas pour ce que vous essayez de faire, vous devriez alors poser une nouvelle question.


La question est la même que je trouve et toujours pertinente apparemment.


La question n'était pas sur le service ServiceHostingenvironment. Il s'agissait d'attribut ASPnetCompativement. Lisez la question à nouveau.



0
votes

Elaborer sur la réponse de Austin Harris:

Vous devez modifier le comportement du service de service.
Étant donné que l'attribut est en lecture seule, vous devez supprimer et réadmettre le comportement au service de service. de
Si vous avez une application de console ou un service Windows, vous aurez ce service de service défini.

quelque chose comme ceci: xxx

dans quel cas Austin Harris ' Le code suffirait (s'il n'avait pas écrit autorisé au lieu de ...).

Toutefois, si vous avez le service WCF intégré à une application ASP.NET, la partie délicate consiste à obtenir le service de service.

La clé est l'attribut d'usine dans le fichier de balisage de votre_service.svc. xxx

alors vous devez écrire votre propre usine.
Le code ci-dessous est VB.NET, je laisserai le lecteur au lecteur de le traduire en C # (vous aurez besoin de définir avec TRUE d'autrement, et C # PS: http://converter.telerik.com ) xxx


0 commentaires

1
votes

Après avoir creusé avec un réflecteur, j'ai pu définir l'indicateur ASPnetCompatibilityencompativement à l'aide de la réflexion. Cette approche a des inconvénients évidents, mais il a fait le travail pour moi: xxx


0 commentaires