Подтвердить что ты не робот

Доступ к HttpContext.Current из веб-службы WCF

Я только начал использовать службы WCF с ASP.NET AJAX. Я создаю экземпляр моей службы WCF из Javascript, а затем передаю строковые переменные в качестве аргументов в свой метод службы WCF (с подписью OperationContract). Затем я возвращаю объект .NET(определенный с помощью DataContract), который привязан к моему пользовательскому классу Javascript. У меня возникли проблемы с аутентификацией на основе пользователя, зарегистрированного в моей веб-сессии. Однако веб-служба WCF представляет собой совершенно другую услугу без контекста для объекта HttpContext.Current. Какой самый безопасный способ получить доступ к этому объекту?

4b9b3361

Ответ 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;
        }