services - acceder a HttpContext.Current desde WCF Web Service
wcf service application (3)
En caso de que no desee cambiar Web.config o no puede cambiarlo:
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;
}
Acabo de empezar a usar WCF Services con ASP.NET AJAX. Instanciando mi servicio WCF desde Javascript y luego paso las variables de cadena como argumentos a mi método de Servicio WCF (con una firma OperationContract). A continuación, devuelvo un objeto .NET (definido con un DataContract) que está vinculado a mi clase Javascript personalizada. Tengo problemas para autenticar en función del usuario que inició sesión en mi sesión web. Sin embargo, el servicio web WCF es un servicio completamente diferente sin contexto para el objeto HttpContext.Current. ¿Cuál es la forma más segura de acceder a ese objeto?
No tiene un HttpContext por defecto, pero tiene muchos de los mismos objetos presentes en OperationContext (que siempre está presente) o WebOperationContext (que solo está disponible para ciertos enlaces).
Puede acceder a OperationContext o WebOperationContext utilizando la propiedad .Current
estática como WebOperationContext.Current
: WebOperationContext.Current
Puede obtener acceso a HttpContext.Current
habilitando AspNetCompatibility, preferiblemente a través de la configuración:
<configuration>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
</configuration>
Eso, a su vez, le permite acceder al usuario actual: HttpContext.Current.User
, que es lo que busca, ¿no?
Incluso puede aplicar AspNetCompatibility decorando su clase de servicio con un atributo adicional:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
(En el espacio de nombres System.ServiceModel.Activation
). Si ese atributo está en su lugar, su servicio no podrá iniciarse a menos que esté habilitado AspNetCompatibility.