首先,我希望基于上下文的存储在整个框架中保持一致!
话虽如此,我正在寻找一种优雅的解决方案,使这些属性在ASP.NET,WCF和任何其他多线程.NET代码中都是安全的.这些属性位于一些低级跟踪帮助程序中(如果您想知道它们为什么是内部的,则通过方法公开).
我宁愿不依赖于不需要的程序集(如System.Web等).我不想要求使用此代码的任何人配置任何东西.我只是想让它起作用;)虽然这可能太高了一个订单......
任何人都有任何诡计?(我看过Spring的实现)
internal static string CurrentInstance
{
get
{
return CallContext.LogicalGetData(currentInstanceSlotName) as string;
}
set
{
CallContext.LogicalSetData(currentInstanceSlotName, value);
}
}
internal static Stack<ActivityState> AmbientActivityId
{
get
{
Stack<ActivityState> stack = CallContext.LogicalGetData(ambientActivityStateSlotName) as Stack<ActivityState>;
if (stack == null)
{
stack = new Stack<ActivityState>();
CallContext.LogicalSetData(ambientActivityStateSlotName, stack);
}
return stack;
}
}
Run Code Online (Sandbox Code Playgroud)
更新
安全我不是说同步.背景在这个问题上这里
我有
FormsAuthentication.SetAuthCookie("someName", True)
Run Code Online (Sandbox Code Playgroud)
作为我的自定义登录序列的一部分.后来,我有一些页面只允许一个特定的角色:
<location path="myPage.aspx">
<system.web>
<authorization>
<allow roles="SomeRole"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
Run Code Online (Sandbox Code Playgroud)
据我所知,这会调用我的角色提供程序的GetRolesForUser实现.它似乎从Web.HttpContext.Current.User.Identity.Name获取用户名参数.
我的问题是...... 来自auth cookie的用户名何时被设置为我当前用户身份中的名称?
我有一个很大程度上依赖于Web服务的Web应用程序.服务的所有内容都是异步完成的,并使用AddOnPreRequestHandlerExecuteAsync.无论如何,我的大多数调用都运行得很好,但是有些调用从异步服务调用返回,在endprerequest中找到一个空的HttpContext.Current.Response/Request对象,当然我试图使用这个错误.两个对象(响应和请求在初始请求失败的调用时可用/非空,并且在其他调用的最终请求中工作).
任何人遇到类似的问题,或猜测可能是什么问题?
更新:似乎找到了一个解决方案,如果我在Init上创建一个HttpApplication的变量(HttpModule的这一切都发生在那里),可以从该变量访问HttpContext.
更新:在begin函数上传递HttpApplication或HttpContext.Current具有相同的问题.当作为异步调用的"状态"的一部分传递时,它们在end函数中最终为null,即使它们在begin函数中有效.
更新:我添加了一些日志记录,发现我正在进行的异步调用正确返回,结果存在,回调函数被正确调用.
我们正在开发一个3层应用程序,我们已被允许使用最新和最好的(MVC2,IIS7.5,WCF,SQL2k8等).WCF服务将应用程序层公开给各种Web应用程序.由于我们控制服务和客户端,因此我们决定使用net.tcp绑定来提高其在HTTP上的性能优势.
我们希望使用ELMAH进行错误记录,包括Web应用程序和服务.这是我的问题.有很多关于将ELMAH与WCF一起使用的信息,但它都适用于HTTP绑定.有谁知道是否/如何使用ELMAH与WCF服务暴露非HTTP端点?
我的猜测是否定的,因为ELMAH需要HttpContext,它需要在web.config 中将AspNetCompatibilityEnabled标志设为true.来自MSDN:
IIS 7.0和WAS允许WCF服务通过HTTP以外的协议进行通信.但是,不允许在启用ASP.NET兼容模式的应用程序中运行的WCF服务公开非HTTP端点.当服务接收到其第一条消息时,这种配置会生成激活异常.
如果您不能将ELMAH与具有非HTTP端点的WCF服务一起使用,那么后续问题是:我们能否以不需要HttpContext的方式使用ELMAH?或者更一般地说(为了不提交细金属标尺错误),有没有办法将ELMAH与具有非HTTP端点的WCF服务一起使用?
注意:我知道我们可以下载Elmah源代码并将其更改为添加填充程序或删除HttpContext依赖项,但我正在尝试避免分叉代码.
如何将会话添加到fakeContext?
我们为部分请求构建此函数,其中内容必须作为字符串返回.只有我们现在在部分请求中没有会话.
我不能像fakeContext.Session = HttpContext.Current.Session那样添加它们
有人建议吗?
///<summary>
/// Invoke the partial request and return the result as a string.
///</summary>
///<param name="context">The controller context to use.</param>
///<returns>A string containing the result of the partial request.</returns>
public String InvokeAsString(ControllerContext context)
{
var stringBuilder = new StringBuilder();
//create memory writer used for httpresponse.
var memoryWriter = new StringWriter(stringBuilder);
//create a fake response
var fakeResponse = new HttpResponse(memoryWriter);
//create a fake context.
var fakeContext = new HttpContext(HttpContext.Current.Request, fakeResponse);
var oldPrincipal = context.HttpContext.User;
fakeContext.User …Run Code Online (Sandbox Code Playgroud) 对于同一Web应用程序的多个用户,是否存在以下代码中的问题?我的意思是,我知道一个纯静态字符串将在单个ASP.NET应用程序的所有会话中共享,但鉴于它明确引用了Current.Session,即使它是静态的,它似乎总是引用会话实例"当前用户".
但是一个错误正在发生,可以通过共享当前值的每个人来解释Mode,因此最近的更改会覆盖其他人的模式值.
(作为背景:此字符串位于Helpers整个应用程序中使用的类中.我不想对Session["Mode"]整个应用程序进行硬编码引用,也不希望Session["Mode"]从aspx.cs页面传递每个方法调用.)
public static string Mode
{
get
{
var value = HttpContext.Current.Session["Mode"];
return (value ?? string.Empty).ToString();
}
set
{
HttpContext.Current.Session["Mode"] = value;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建自己的自定义HTTP上下文:
CustomHttpContext : HttpContextBase
{
public override HttpRequestBase Request { }
}
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚的一件事是如何初始化基类
System.Web.HttpContext.Current
Run Code Online (Sandbox Code Playgroud)
有没有人有任何想法我如何首先使用Current Http初始化自定义上下文然后覆盖某些方法/属性以满足我自己的目的?
我正在编写单元测试,并且控制器方法抛出异常,因为HttpContext/ControllerContext为null.我不需要从HttpContext断言任何东西,只需要它不是NULL.我做过研究,我相信Moq就是答案.但是我见过的所有样本都没有给我很多帮助.我不需要做任何花哨的事情,只是为了模拟httpcontext.指出我正确的方向!
我在.NET 4.5 Web应用程序中定义了以下简单的WCF服务:
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet(UriTemplate = "json/DoWork/", ResponseFormat = WebMessageFormat.Json)]
Task<string> DoWork();
}
public class Service1 : IService1
{
public async Task<string> DoWork()
{
Debug.WriteLine(HttpContext.Current != null);
var s = await new HttpClient().GetStringAsync("http://www.google.com");
Debug.WriteLine(HttpContext.Current != null);
return s;
}
}
Run Code Online (Sandbox Code Playgroud)
而web.config是:
<configuration>
<system.web>
<compilation debug="true"
targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
<system.serviceModel>
<services>
<service name="WebApplication1.Service1">
<endpoint address=""
binding="webHttpBinding"
contract="WebApplication1.IService1"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true"
httpsGetEnabled="true" …Run Code Online (Sandbox Code Playgroud) 在现有的.Net网站中,可以使用服务器变量访问
HttpContext.Current.Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"]
Run Code Online (Sandbox Code Playgroud)
如何访问AspnetCore 1.0 Web应用程序中的ServerVariables?
在控制器内部调试时,this.HttpContext.Features不包含IServerVariablesFeature.
server-variables httpcontext request.servervariables asp.net-core
httpcontext ×10
asp.net ×4
c# ×4
session ×2
wcf ×2
.net ×1
asp.net-core ×1
async-await ×1
asynchronous ×1
elmah ×1
mocking ×1
moq ×1
net.tcp ×1
null ×1
response ×1
roleprovider ×1
static ×1
unit-testing ×1
was ×1