我有一个Web服务,我正在尝试进行单元测试.在服务中,它从HttpContext类似物中提取了几个值,因此:
m_password = (string)HttpContext.Current.Session["CustomerId"];
m_userID = (string)HttpContext.Current.Session["CustomerUrl"];
Run Code Online (Sandbox Code Playgroud)
在单元测试中,我使用简单的工作者请求创建上下文,如下所示:
SimpleWorkerRequest request = new SimpleWorkerRequest("", "", "", null, new StringWriter());
HttpContext context = new HttpContext(request);
HttpContext.Current = context;
Run Code Online (Sandbox Code Playgroud)
但是,每当我尝试设置值时 HttpContext.Current.Session
HttpContext.Current.Session["CustomerId"] = "customer1";
HttpContext.Current.Session["CustomerUrl"] = "customer1Url";
Run Code Online (Sandbox Code Playgroud)
我得到null引用异常,表示HttpContext.Current.Session为null.
有没有办法在单元测试中初始化当前会话?
我正在尝试将单元测试添加到我构建的ASP.NET MVC应用程序中.在我的单元测试中,我使用以下代码:
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
Run Code Online (Sandbox Code Playgroud)
使用以下帮助程序来模拟控制器上下文:
public static class FakeControllerContext {
public static HttpContextBase FakeHttpContext(string username) {
var context = new Mock<HttpContextBase>();
context.SetupGet(ctx => ctx.Request.IsAuthenticated).Returns(!string.IsNullOrEmpty(username));
if (!string.IsNullOrEmpty(username))
context.SetupGet(ctx => ctx.User.Identity).Returns(FakeIdentity.CreateIdentity(username));
return context.Object;
}
public static void SetFakeControllerContext(this Controller controller, string username = null) {
var httpContext = FakeHttpContext(username);
var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;
}
}
Run Code Online (Sandbox Code Playgroud)
此测试类继承自具有以下内容的基类:
[TestInitialize]
public void Init() {
...
} …Run Code Online (Sandbox Code Playgroud) 我正在使用一些WebForms/MVC无关的工具,我需要获得一个HttpContext给定HttpContextBase对象引用的实例.我无法使用,HttpContext.Current因为我需要它也可以异步工作(在异步请求期间HttpContext.Current返回null).我知道HttpContextWrapper,但走错了路.
[TestMethod]
public void Home_Message_Display_Unknown_User_when_coockie_does_not_exist()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
context
.Setup(c => c.Request)
.Returns(request.Object);
HomeController controller = new HomeController();
controller.HttpContext = context; //Here I am getting an error (read only).
...
}
Run Code Online (Sandbox Code Playgroud)
我的基本控制器有一个重写的Initialize,它得到了这个requestContext.我试图通过这个,但我没有做正确的事情.
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
}
Run Code Online (Sandbox Code Playgroud)
在哪里可以获得有关使用Moq模拟我的RequestContext和HttpContext的更多信息?我正在尝试模拟cookie和一般上下文.
我System.Timers.Timer在我的Asp.Net应用程序中使用a ,我需要使用HttpServerUtility.MapPath似乎只能通过的方法HttpContext.Current.Server.MapPath.问题是,HttpContext.Current是null的,当Timer.Elapsed事件触发.
是否有另一种方法来获取对HttpServerUtility对象的引用?我可以在我的类'构造函数中注入它.安全吗?如何确保在当前请求结束时不会收集垃圾?
谢谢!
这实际上是一个两部分问题.首先,HttpContext.Current是否对应于当前的System.UI.Page对象?
第二个问题,可能与第一个问题有关,为什么我不能使用以下内容来查看当前页面是否实现了一个接口:
private IWebBase FindWebBase()
{
if (HttpContext.Current as IWebBase != null)
{
return (IWebBase)HttpContext.Current.;
}
throw new NotImplementedException("Crawling for IWebBase not implemented yet");
}
Run Code Online (Sandbox Code Playgroud)
一般上下文是某些控件需要知道它们是作为SharePoint Webpart执行还是作为Asp.Net框架的一部分执行.
我通过要求控件传递对自身的引用,并检查控件的Page属性来解决问题,但我仍然很好奇为什么上面的方法不起作用.
编译器错误是:无法通过引用转换,装箱转换,拆箱转换,包装转换或空类型转换将System.Web.HttpContext转换为... IWebBase.
我想获取WCF应用程序的工作文件夹.我怎么才能得到它?
如果我试试
HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath)
Run Code Online (Sandbox Code Playgroud)
我得到一个空引用异常(Http.Current对象为null).
我对工作文件夹的意思是我的WCF服务正在运行的文件夹.如果我设置aspNetCompatibilityEnabled="true",我收到此错误:
服务器没有提供有意义的回复; 这可能是由于合同不匹配,过早的会话关闭或内部服务器错误造成的.
我的问题与此有点相关:具有依赖注入的HttpContext.Items的WebApi等价物.
我们想使用Ninject在WebApi区域中使用HttpContext.Current注入一个类.
我担心的是,这可能非常危险,因为在WebApi(一切?)是异步的.
如果我在这些方面有误,请纠正我,这是我到目前为止调查的内容:
HttpContext.Current通过Thread获取当前上下文(我直接查看了实现).
在异步任务中使用HttpContext.Current是不可能的,因为它可以在另一个Thread上运行.
WebApi使用IHttpController和method Task<HttpResponseMessage> ExecuteAsync=>每个请求都是async =>你不能在action方法中使用HttpContext.Current.它甚至可能发生,更多的请求是通过相同的线程在同一个线程上执行的.
为了创建带有注入内容的控制器到构造函数中,IHttpControllerActivator与sync方法一起使用IHttpController Create.这是,ninject创建Controller及其所有依赖项.
如果我在所有这4点中都是正确的,那么在动作方法或下面的任何层中使用HttpContext.Current是非常危险的,并且可能会产生意外结果.我看到很多公认的答案正是如此.恕我直言,这可以工作一段时间,但会在负载下失败.
但是当使用DI创建一个Controller及其依赖项时,它是好的,因为它运行在一个独立的线程上.我可以从构造函数中的HttpContext获取一个值,它会安全吗?.我想知道每个Controller是否在每个请求的单个线程上创建,因为这可能会导致重负载下的问题,其中可以使用来自IIS的所有线程.
只是为了解释为什么我要注入HttpContext的东西:
我们想要的解决方案:它们之间的所有层都没有被这个感染,我们可以在代码深处使用注入的请求(例如在一些依赖于URL的ConfigurationProvider中)
如果我完全错误或者我的建议是正确的,请告诉我你的意见,因为这个主题似乎非常复杂.Thx提前!
multithreading asynchronous ninject httpcontext asp.net-web-api
我有一个C#ASP.NET应用程序,它启动了大约25个不同的线程,在一个名为SiteCrawler.cs的类中运行一些方法.
在HttpContext.Current.Session我要保存用户所做的搜索结果,当所有线程都完成运行它呈现给用户.我的问题是该HttpContext.Current对象在生成的线程中为null,因为它不存在.
由于应用程序是多线程的限制,我还有什么其他选项来保存用户/会话特定数据而不使用会话?
我试图搜索Stackoverflow的每一寸都找到一个解决方案,但没有任何运气....
我正在关注Microsoft的这个ASP.NET MVC教程:
我的代码略有不同,我试图HttpContext.Request.IsAuthenticated在控制器的构造函数中访问.
namespace SCE.Controllers.Application
{
public abstract class ApplicationController : Controller
{
public ApplicationController()
{
bool usuario = HttpContext.Request.IsAuthenticated;
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是HttpContext始终为空.
这个问题有方法解决吗?
httpcontext ×10
c# ×5
asp.net ×3
asp.net-mvc ×3
mocking ×2
unit-testing ×2
.net ×1
asynchronous ×1
controllers ×1
moq ×1
ninject ×1
path ×1
session ×1
timer ×1
wcf ×1
web-services ×1