32 Stimmen

Zugriff auf HttpContext.Current vom WCF-Webdienst

Ich habe gerade angefangen, WCF-Dienste mit ASP.NET AJAX zu verwenden. Ich instanziere meinen WCF-Dienst aus Javascript und übergebe dann String-Variablen als Argumente an meine WCF-Dienst-Methode (mit einer OperationContract-Signatur). Ich gebe dann ein .NET-Objekt zurück (definiert mit einem DataContract), das an meine eigene Javascript-Klasse gebunden ist. Ich habe Probleme bei der Authentifizierung auf der Grundlage des Benutzers, der in meiner Web-Sitzung angemeldet ist. Der WCF-Webdienst ist jedoch ein völlig anderer Dienst ohne Kontext zum HttpContext.Current-Objekt. Was ist der sicherste Weg, um Zugriff auf dieses Objekt zu erhalten?

54voto

mthierba Punkte 5527

Sie können Zugang erhalten zu HttpContext.Current durch Aktivierung von AspNetCompatibility, vorzugsweise über die Konfiguration:

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

Dies wiederum ermöglicht Ihnen den Zugriff auf den aktuellen Benutzer: HttpContext.Current.User - Das ist doch das, was Sie wollen, oder?

Sie können AspNetCompatibility sogar erzwingen, indem Sie Ihre Serviceklasse mit einem zusätzlichen Attribut ausstatten:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

(In der System.ServiceModel.Activation Namespace). Wenn dieses Attribut vorhanden ist, wird Ihr Dienst nicht starten, es sei denn, AspNetCompatibility ist aktiviert!

27voto

faester Punkte 14508

Sie haben standardmäßig keinen HttpContext, aber Sie haben viele der gleichen Objekte im OperationContext (der immer vorhanden ist) oder im WebOperationContext (der nur für bestimmte Bindungen verfügbar ist).

Sie können auf den OperationContext oder WebOperationContext zugreifen, indem Sie die statische .Current Eigenschaft wie folgt: WebOperationContext.Current

4voto

nikolai.serdiuk Punkte 702

Falls Sie die Web.config nicht ändern wollen oder können, können Sie sie auch nicht ändern:

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;
        }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X