C# Ссылка на объект требуется для нестатического c поля, метода или свойства 'HttpContext.Request' - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь создать общий класс фабрики для вызова WCF и внедрения некоторых заголовков. В этом классе я пытаюсь прочитать свойства заголовка HTTP.

    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using ServiceReference;
    using Microsoft.AspNetCore.Http;
namespace Service
{
     public class ServiceFactory
        {

            public static ServiceClient Create()
            {
                ServiceProxy service = new ServiceProxy();
                string userName = HttpContext.Request.Headers["AUTH_USERNAME"];
                string authenricationType = HttpContext.Request.Headers["AUTH_TYPE"];

                using (new System.ServiceModel.OperationContextScope((System.ServiceModel.IClientChannel)service.InnerChannel))
                {          
                    HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
                    requestMessage.Headers["AUTH_USERNAME"] = userName;
                    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;

                    requestMessage.Headers["AUTH_TYPE"] = authenricationType;
                    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
                }
                return service;
            }       
        }
}

Но я получаю ошибку компиляции в виде "Ссылка на объект требуется для нестатического c поля, метода или свойства 'HttpContext.Request' . Поскольку я Я не вызываю метод Stati c или класс, как это могло бы произойти. Любая помощь будет высоко оценена.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 08 января 2020

HttpContext.Request не будет работать, потому что он пытается получить доступ к свойству экземпляра, как если бы это было свойство stati c. HttpContext.Current.Request должно работать, предполагая, что контекст связан с потоком к этой точке

Разница между HttpContext.Request и Request

1 голос
/ 08 января 2020

В WCF нет HttpContext, сеанс WCF отличается от сеанса Http. См. Ссылку ниже.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-services-and-aspnet?redirectedfrom=MSDN
На стороне сервера мы можем включить режим совместимости Asp. net для доступа к HttpContext. Это требует от нас размещения сервиса в IIS.

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

Ссылка.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/aspnet-compatibility?redirectedfrom=MSDN
https://www.aspsnippets.com/Articles/Access-and-Use-HttpContextCurrent-in-WCF-Service-in-ASPNet.aspx
Однако невозможно доступ к нему на стороне клиента. Как вы сделали. Настройка заголовка HTTP может быть завершена с помощью класса OperationContext.

using (new OperationContextScope((IClientChannel)service))
            {
                //first method to add HTTP header.
                //HttpRequestMessageProperty request = new HttpRequestMessageProperty();
                //request.Headers["MyHttpheader"] = "myvalue";
                //OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = request;
                //WebOperationContext is syntax sugar of wrapper above method.                OperationContext oc = OperationContext.Current;
                WebOperationContext woc = new WebOperationContext(oc);
                woc.OutgoingRequest.Headers.Add("myhttpheader", "myvalue");
                //invocation, only valid in this request.
                var result = service.GetResult();
                Console.WriteLine(result);
            }

Вот связанное обсуждение.
HttpContext в WCF
Не стесняйтесь сообщить мне, если есть Я могу помочь с чем угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...