получить доступ к HttpContext.Current из веб-службы WCF - PullRequest
29 голосов
/ 06 мая 2011

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

Ответы [ 3 ]

50 голосов
/ 06 мая 2011

Вы можете получить доступ к HttpContext.Current, включив AspNetCompatibility, предпочтительно через конфигурацию:

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

Это, в свою очередь, позволяет получить доступ к текущему пользователю: HttpContext.Current.User - это то, что вы 'после, верно?

Вы даже можете применить AspNetCompatibility, украсив свой класс обслуживания дополнительным атрибутом:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

(в пространстве имен System.ServiceModel.Activation.) Если этот атрибут присутствуетваш сервис не запустится, если не включена совместимость с AspNet!

25 голосов
/ 06 мая 2011

У вас нет HttpContext по умолчанию, но у вас есть много одинаковых объектов, присутствующих в OperationContext (который присутствует всегда) или WebOperationContext (который доступен только для определенных привязок.

Вы можете получить доступ к OperationContext или WebOperationContext, используя статическое свойство .Current, например: WebOperationContext.Current

3 голосов
/ 14 января 2015

Если вы не хотите изменять 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;
        }
...