Я только начал использовать службы WCF с ASP.NET AJAX. Я создаю экземпляр моей службы WCF из Javascript, а затем передаю строковые переменные в качестве аргументов в свой метод службы WCF (с подписью OperationContract). Затем я возвращаю объект .NET(определенный с помощью DataContract), который привязан к моему пользовательскому классу Javascript. У меня возникли проблемы с аутентификацией на основе пользователя, зарегистрированного в моей веб-сессии. Однако веб-служба WCF представляет собой совершенно другую услугу без контекста для объекта HttpContext.Current. Какой самый безопасный способ получить доступ к этому объекту?
Доступ к HttpContext.Current из веб-службы WCF
Ответ 1
Вы можете получить доступ к HttpContext.Current
, включив AspNetCompatibility, предпочтительно через конфигурацию:
<configuration>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
</configuration>
Это, в свою очередь, позволяет получить доступ к текущему пользователю: HttpContext.Current.User
- это то, что вам нужно, правильно?
Вы даже можете обеспечить соответствие AspNetCompatibility, украсив ваш класс службы дополнительным атрибутом:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
(В пространстве имен System.ServiceModel.Activation
.)
Если этот атрибут установлен, ваша служба не запустится, если не включена функция AspNetCompatibility!
Ответ 2
У вас нет HttpContext по умолчанию, но у вас есть много одинаковых объектов, присутствующих в OperationContext (который всегда присутствует) или WebOperationContext (который доступен только для определенных привязок.
Вы можете получить доступ к OperationContext или WebOperationContext, используя статическое свойство .Current
, например: WebOperationContext.Current
Ответ 3
Если вы не хотите изменять Web.config или вы не можете его изменить:
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;
}