标签: httpcontext

如何从ashx文件中获取QueryString?

有一个ashx文件,其中包含"ProcessRequest(HttpContext context)"自动触发的方法.何时以及如何被触发?另一个问题是,当我在这个文件中时,如何获取当前的QueryString?当我输入context.Request.QueryString"时,它表示它为空或为空地址有参数.

asp.net ashx httpcontext request.querystring

12
推荐指数
1
解决办法
3万
查看次数

使用HttpContext.Current.Application存储简单数据

我想在我的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"].

这样做有什么缺点吗?看起来它会对我想要实现的目标起作用,但是有没有人知道更好的方法来做到这一点,假设我已经列出的方法有一些主要的缺点?

c# asp.net-mvc httpcontext

11
推荐指数
3
解决办法
4万
查看次数

从自定义处理程序调用默认的asp.net HttpHandler

我正在将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处理程序",但不识别类或给出任何可能如何使用它的指示.

有关如何做到这一点的任何想法?可能吗?

asp.net routing httphandler httpcontext

11
推荐指数
1
解决办法
6343
查看次数

在asp.net/mvc中的控制器内的动作中为http响应添加标头

我正在将数据从服务器传输到客户端以供下载使用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是一个属性,用作类型."

我在正确的位置更新标题吗?有没有其他方法可以做到这一点?

c# asp.net-mvc response httpcontext

11
推荐指数
2
解决办法
5万
查看次数

异步任务中的HttpContext.Current null

我有一个使用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不会为空?

c# ninject httpcontext async-await

11
推荐指数
1
解决办法
9516
查看次数

如何在ASP.NET 5/MVC 6中的单元测试中访问HttpContext

假设我在中间件的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)

asp.net unit-testing httpcontext asp.net-core-mvc

11
推荐指数
2
解决办法
9210
查看次数

我为什么要将IHttpContextAccessor注入Singleton

在我看过IHttpContextAccessor注射的所有例子中,它被设置为Singleton.

例子:

如何在ASP.NET Core 1.0的DI中的Startup类中添加IHttpContextAccessor? 将IHttpContextAccessor注入ApplicationDbContext ASP.NET Core 1.0 .NET Core IHttpContextAccessor问题

我发现它有点奇怪,因为它HttpContext看起来像是映射到请求的东西.AddScoped在这种情况下不是更合适吗?

Singleton真的是推荐的方式吗?我没有看到什么吗?

c# asp.net httpcontext asp.net-core

11
推荐指数
1
解决办法
2543
查看次数

我可以欺骗HttpRequest.Current.Request.IsLocal吗?

我正在运行一个Web应用程序,它显示一些调试行为,如果它在本地运行 - 引用资源字符串等 - 我想在我的笔记本电脑上演示应用程序,我将无法访问互联网,所以它必须是本地的.

该应用程序使用HttpContext.Current.Request.IsLocal来确定它是否在本地运行 - 有什么方法可以欺骗它吗?即使我确实在本地运行,我还是想把它变成"假".

我确实可以访问源代码(并且意识到我可以演示一个"IsLocal"检查被注释掉的构建),但是不想为这个演示做一个特殊的构建.如果需要,我会这样做,但我宁愿使用现有的代码库.

asp.net httpcontext

10
推荐指数
2
解决办法
6494
查看次数

使用HttpContextScoped()时,StructureMap不处理数据上下文

我的目标是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自动执行此操作.

structuremap asp.net asp.net-mvc httpcontext

10
推荐指数
2
解决办法
4266
查看次数

如何设置特定于ASP.NET请求的log4net上下文属性?

我一直在使用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服务器事件记录的非常基本的功能.

asp.net log4net properties httpcontext

10
推荐指数
1
解决办法
9532
查看次数