簡體   English   中英

C# 非靜態字段、方法或屬性“HttpContext.Request”需要對象引用

[英]C# An object reference is required for the non-static field, method, or property 'HttpContext.Request'

我正在嘗試創建一個通用工廠類來調用 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;
            }       
        }
}

但是我收到一個編譯錯誤,因為“非靜態字段、方法或屬性 'HttpContext.Request' 需要一個對象引用。由於我不是從靜態方法或類調用,這是怎么發生的。任何幫助都會受到高度贊賞。

謝謝你。

HttpContext.Request將不起作用,因為它試圖訪問一個實例屬性,就好像它是一個靜態屬性一樣。 HttpContext.Current.Request應該可以工作,假設到那時上下文已經與線程相關聯

HttpContext.Request 和 Request 的區別

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);
            }

這是一個相關的討論。
WCF 中的 HttpContext
如果有什么我可以幫忙的,請隨時告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM