non-static 字段、方法或 属性 'HttpContext.Request' 需要 C# object 引用
C# An object reference is required for the non-static field, method, or property 'HttpContext.Request'
我正在尝试创建一个公共工厂 class 来调用 WCF 并注入一些 headers。在此 class 中,我试图读取 HTTP Header 属性。
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;
}
}
}
但我收到编译错误 “non-static 字段、方法或 属性 'HttpContext.Request'[需要 object 引用=22=]。因为我不是从静态方法或 class 调用这怎么会发生。任何帮助将不胜感激。
谢谢。
HttpContext.Request
将不起作用,因为它试图访问一个实例 属性,就好像它是一个静态 属性。 HttpContext.Current.Request
应该可以工作,假设此时上下文已与线程相关联
WCF中没有HttpContext
,WCFsession不同于Httpsession。请参考以下link.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-services-and-aspnet?redirectedfrom=MSDN
在 server-side 上,我们可以启用 Asp.net 兼容模式来访问 HttpContext。这需要我们在 IIS 中托管该服务。
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Link.
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
但是,无法在 client-side 上访问它。正如你所做的那样。配置 HTTP header 可以由 OperationContext class.
完成
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 in WCF
如果有什么我可以帮忙的,请随时告诉我。
我正在尝试创建一个公共工厂 class 来调用 WCF 并注入一些 headers。在此 class 中,我试图读取 HTTP Header 属性。
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;
}
}
}
但我收到编译错误 “non-static 字段、方法或 属性 'HttpContext.Request'[需要 object 引用=22=]。因为我不是从静态方法或 class 调用这怎么会发生。任何帮助将不胜感激。
谢谢。
HttpContext.Request
将不起作用,因为它试图访问一个实例 属性,就好像它是一个静态 属性。 HttpContext.Current.Request
应该可以工作,假设此时上下文已与线程相关联
WCF中没有HttpContext
,WCFsession不同于Httpsession。请参考以下link.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-services-and-aspnet?redirectedfrom=MSDN
在 server-side 上,我们可以启用 Asp.net 兼容模式来访问 HttpContext。这需要我们在 IIS 中托管该服务。
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Link.
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
但是,无法在 client-side 上访问它。正如你所做的那样。配置 HTTP header 可以由 OperationContext class.
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 in WCF
如果有什么我可以帮忙的,请随时告诉我。