有一个ashx文件,其中包含"ProcessRequest(HttpContext context)"自动触发的方法.何时以及如何被触发?另一个问题是,当我在这个文件中时,如何获取当前的QueryString?当我输入context.Request.QueryString"时,它表示它为空或为空地址有参数.
我想在我的ASP.NET MVC应用程序中存储一个简单对象(包含三个字符串)的小列表.该列表是从数据库加载的,并且很少通过编辑站点管理区域中的某些值来更新.
我正在考虑使用HttpContext.Current.Application来存储它.这样我可以在Global.asax中加载它:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
HttpContext.Current.Application["myObject"] = loadDataFromSql(); // returns my object
}
Run Code Online (Sandbox Code Playgroud)
然后可以根据需要从任何控制器或视图轻松引用它.然后,如果管理区域调用updateMyObject控制器操作,我可以更新数据库并再次加载并替换HttpContext.Current.Application["myObject"].
这样做有什么缺点吗?看起来它会对我想要实现的目标起作用,但是有没有人知道更好的方法来做到这一点,假设我已经列出的方法有一些主要的缺点?
我正在将ASP.NET路由添加到较旧的webforms应用程序中.我正在使用自定义HttpHandler来处理所有内容.在某些情况下,我想将特定路径映射回aspx文件,因此我需要将控制权传递回asp.net的默认HttpHandler.
我得到的最接近的是这个
public void ProcessRequest(HttpContext context) {
// .. when we decide to pass it on
var handler = new System.Web.UI.Page();
handler.ProcessRequest(context);
MemoryStream steam = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
HtmlTextWriter htmlWriter = new HtmlTextWriter(writer);
handler.RenderControl(htmlWriter);
// write headers, etc. & send stream to Response
}
Run Code Online (Sandbox Code Playgroud)
它没有做任何事情,流没有任何输出.MS的System.Web.UI.Page文档(作为IHttpHandler)说"不要调用ProcessRequest方法.它是供内部使用的".
从环顾四周看来你可以用MVC做到这一点,例如:MvcHttpHandler似乎没有实现IHttpHandler
还有一件事System.Web.UI.PageHandlerFactory似乎只会为aspx文件生成一个Page处理程序,但它是内部的,我不能直接使用它.
此页面:http://msdn.microsoft.com/en-us/library/bb398986.aspx引用"默认的asp.net处理程序",但不识别类或给出任何可能如何使用它的指示.
有关如何做到这一点的任何想法?可能吗?
我正在将数据从服务器传输到客户端以供下载使用filestream.write.在这种情况下,发生的事情是我能够下载该文件,但它不会在我的浏览器中显示为下载."另存为"弹出窗口不会出现在"下载"部分中的"下载栏"中.从四处查看,我想我需要在响应标题中包含"something"来告诉浏览器这个响应有一个附件.我也想设置cookie.要做到这一点,这就是我在做的事情:
[HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" & name)]
public ActionResult Download(string name)
{
// some more code to get data in inputstream.
using (FileStream fs = System.IO.File.OpenWrite(TargetFile))
{
byte[] buffer = new byte[SegmentSize];
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, SegmentSize)) > 0)
{
fs.WriteAsync(buffer, 0, bytesRead);
}
}
}
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:"System.web.httpcontext.current是一个属性,用作类型."
我在正确的位置更新标题吗?有没有其他方法可以做到这一点?
我有一个使用repository(userRepo)的方法:
public override Task<IdentityResult> CreateLocalUserAsync(IUser user, string password, CancellationToken cancellationToken)
{
var task = new Task<IdentityResult>(() => {
TUserEntity newUser = new TUserEntity
{
Id = user.Id,
UserName = user.UserName,
Password = password
};
userRepo.Save(newUser).Flush();
return new IdentityResult(true);
}, cancellationToken);
task.Start();
return task;
}
Run Code Online (Sandbox Code Playgroud)
该userRepo对象具有使用的依赖项HttpContext.Current.这两个都是使用ninject解决的InRequestScope.
AccountController在Mvc 5中默认调用上面的方法:
var result = await IdentityManager.Users.CreateLocalUserAsync(user, model.Password);
Run Code Online (Sandbox Code Playgroud)
我尝试将此设置添加到web.config:
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
Run Code Online (Sandbox Code Playgroud)
另外,我肯定使用的是.NET 4.5.这也在我的web.config中:
<httpRuntime targetFramework="4.5" />
Run Code Online (Sandbox Code Playgroud)
HttpContext在我开始执行任务之前无法获取信息,因为任务中的依赖userRepo项正在使用信息,并且使用Ninject解析了这两个对象.
我怎样才能确保HttpContext.Current不会为空?
假设我在中间件的http上下文中设置了一个值.例如HttpContext.User.
如何在单元测试中测试http上下文.这是我想要做的一个例子
中间件
public class MyAuthMiddleware
{
private readonly RequestDelegate _next;
public MyAuthMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
context.User = SetUser();
await next(context);
}
}
Run Code Online (Sandbox Code Playgroud)
测试
[Fact]
public async Task UserShouldBeAuthenticated()
{
var server = TestServer.Create((app) =>
{
app.UseMiddleware<MyAuthMiddleware>();
});
using(server)
{
var response = await server.CreateClient().GetAsync("/");
// After calling the middleware I want to assert that
// the user in the HttpContext was set correctly
// but how can I access the …Run Code Online (Sandbox Code Playgroud) 在我看过IHttpContextAccessor注射的所有例子中,它被设置为Singleton.
例子:
如何在ASP.NET Core 1.0的DI中的Startup类中添加IHttpContextAccessor? 将IHttpContextAccessor注入ApplicationDbContext ASP.NET Core 1.0 .NET Core IHttpContextAccessor问题
我发现它有点奇怪,因为它HttpContext看起来像是映射到请求的东西.AddScoped在这种情况下不是更合适吗?
Singleton真的是推荐的方式吗?我没有看到什么吗?
我正在运行一个Web应用程序,它显示一些调试行为,如果它在本地运行 - 引用资源字符串等 - 我想在我的笔记本电脑上演示应用程序,我将无法访问互联网,所以它必须是本地的.
该应用程序使用HttpContext.Current.Request.IsLocal来确定它是否在本地运行 - 有什么方法可以欺骗它吗?即使我确实在本地运行,我还是想把它变成"假".
我确实可以访问源代码(并且意识到我可以演示一个"IsLocal"检查被注释掉的构建),但是不想为这个演示做一个特殊的构建.如果需要,我会这样做,但我宁愿使用现有的代码库.
我的目标是MainDbContext在ASP.NET MVC中为每个HTTP请求提供一个数据上下文(),并在请求结束时处理数据上下文.
我正在使用以下StructureMap配置:
public static class ContainerConfigurer
{
public static void Configure()
{
ObjectFactory.Initialize(x =>
{
x.For<MainDbContext>().HttpContextScoped();
});
}
}
Run Code Online (Sandbox Code Playgroud)
每当我需要时MainDbContext,我都在使用这段代码:
var dbContext = ObjectFactory.GetInstance<MainDbContext>();
Run Code Online (Sandbox Code Playgroud)
这是按预期工作的:每个HTTP请求只创建一个数据上下文.问题是,MainDbContext在请求结束时没有处理.
如何在HTTP请求完成时配置我的ObjectFactory来处理数据上下文?或者这只是我需要Application_EndRequest()在Global.asax中手动使用的东西.
更新
我刚刚尝试将以下代码添加到Global.asax:
protected virtual void Application_EndRequest()
{
ObjectFactory.GetInstance<MainDbContext>().Dispose();
}
Run Code Online (Sandbox Code Playgroud)
正如所料,这解决了这个问题.我仍然想知道是否有任何方法可以使用StructureMap自动执行此操作.
我一直在使用log4net来记录我们的ASP.NET网站的日志消息,最近我想添加有关错误发生的页面/处理程序的信息.因此我决定将以下行添加到Global.asax:
void Application_BeginRequest(object sender, EventArgs e)
{
log4net.ThreadContext.Properties["page"] = HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath;
}
Run Code Online (Sandbox Code Playgroud)
我明智地加入%property{page}了我的转换模式:
<conversionPattern value="%newline%date %-5level %property{page} - %message%newline%newline%newline" />
Run Code Online (Sandbox Code Playgroud)
这适用于单个请求.但后来我在日志中注意到,在ASP.NET请求期间,页面属性可能会发生变化.我已经登录了一个ASHX处理程序,并且在其处理过程中,页面属性将更改为指向ASPX页面的不同值.我得出结论,有另一个请求进入ASP.NET并且它BeginRequest被执行并且静态页面属性log4net.ThreadContext被更改为另一个值.
现在,我想维护每个请求的页面属性,以便我可以将执行页面的路径一致地记录到日志中.我试图找到答案,但我一无所获.解决此问题的推荐方法是什么?我确信这是Web服务器事件记录的非常基本的功能.
httpcontext ×10
asp.net ×7
c# ×4
asp.net-mvc ×3
ashx ×1
asp.net-core ×1
async-await ×1
httphandler ×1
log4net ×1
ninject ×1
properties ×1
response ×1
routing ×1
structuremap ×1
unit-testing ×1