我正在使用FormsAuthentication用于ASP.NET站点,该站点具有显示当前登录用户的主页,Page.User.Identity.Name.
他们可以在他们的设置中更改他们的用户名,当这样做时,我会为他们更新他们的cookie,这样他们就不必签回/用回发签到.
FormsAuthentication.SignOut();
FormsAuthentication.SetAuthCookie(username, false);
Run Code Online (Sandbox Code Playgroud)
我可能非常挑剔,但在他们更改用户名后,母版页仍会显示其原始用户名,直到他们重新加载或加载不同的页面.
有没有办法以编程方式更新当前的Page.User,以便在同一回发期间显示他们的新用户名?
我真的迷失了如何使用HttpContext.User.我到处都读到了FormAutherication的优点,但我不知道它是如何工作的.如果我做这样的事情:
ControllerContext.HttpContext.User = new GenericPrincipal(GetUser(username, password), roles);
Run Code Online (Sandbox Code Playgroud)
ControllerContext.HttpContext.User包含什么?以及如何通过这种方式访问用户信息?
我认为我有这样的行动:
public User GetUser(string username, string password)
{
try
{
var user = (from u in dm.Users
join r in dm.Roles
on u.Role_ID_FK equals r.RoleID
where u.Username.Equals(username) && u.Password.Equals(password)
select u).Single();
return user;
}
catch (Exception e)
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
然后如果我想在我的视图中使用用户信息,比如用户名或角色,我可以在我的视图中调用ControllerContext.HttpContext.User.Username.但这看起来是错误的方式.
那么你们可以给我一个方向,或者发布一个链接到一个可以的网站吗?
我有一个项目作为参考添加到System.Web.
但是,它似乎无法拿起HttpContext.这样做:
Imports System.Web
_ApplicationBase = HttpContext.Current()
Run Code Online (Sandbox Code Playgroud)
告诉我没有声明HttpContext.如果你看一下System.Web里面的方法和属性几乎没有任何显示:只有AspHostingPermission,AspHostingPermissionAttribute,AspHostingPermissionLevel和Services.
引用有效并指向正确的位置.这让我发疯了 - 我错过了什么?
干杯,马特
我的NHibernate会话管理设置如下:
protected MvcApplication()
{
BeginRequest += delegate
{
NHibernateSessionManager.Instance.OpenSession();
};
EndRequest += delegate
{
NHibernateSessionManager.Instance.CloseSession();
};
}
Run Code Online (Sandbox Code Playgroud)
当我需要保存到数据库时,我创建了一个如下所示的ActionFilterAttribute:
public class TransactionAttribute:ActionFilterAttribute {private ITransaction _currentTransaction;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_currentTransaction = NHibernateSessionManager.Instance.CurrentSession.Transaction;
_currentTransaction.Begin();
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (_currentTransaction.IsActive)
{
if (filterContext.Exception == null)
_currentTransaction.Commit();
else
{
_currentTransaction.Rollback();
}
}
_currentTransaction.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我可以将[Transaction]添加到我的action方法中.这似乎适用于初始测试,但我尝试在HttpWebRequest使用多次从另一个应用程序调用一个动作方法,我遇到了问题.使用Fiddler进行测试我设置了一个POST请求,然后快速连续关闭它们,它显示以下内容:

红色是我认为与线程有关的各种错误.
我的NHibernateSessionManager使用HTtpContext来存储会话,如下所示:
public ISession CurrentSession
{
get { return (ISession)HttpContext.Current.Items["current.session"]; }
set { HttpContext.Current.Items["current.session"] = value; }
}
Run Code Online (Sandbox Code Playgroud)
因此,为了修复它,我将我的事务代码移动到我的BeginRequest和EndRequest方法中 - 然后我可以连续启动堆.
我的问题是 …
我试图了解httpcontext如何在.NET中工作的细节?
我无法理解的是HttpContext类有一个静态HttpContext对象的字段.那么对于来自客户端的每个请求是否创建了httpcontext的实例?为什么定义为静态?这是否意味着一个应用程序只能有一个httpcontext?
我很困惑所以问问题的方式可能有点复杂.我希望这是可以理解的.
提前致谢,
如您所知,HttpContext.Current返回应用程序管道中的当前上下文.
此属性也是static,因此逻辑上对该属性或其属性的任何更改都应该影响其他管道.
静态字段确切地标识一个存储位置.无论创建了多少个类实例,都只有一个静态字段的副本. 更多
IIS如何处理这个以防止其他管道上的冲突,并且HttpContext.Current每个管道上的每个管道都是唯一的?
例如,对于已登录系统的两个用户,将HttpContext.Current.User.Identity.Name给出将请求发送到服务器的用户的用户名.
ASP.NET管道:

foreach (string key in HttpContext.Current.Request.Form.AllKeys)
{
string value = HttpContext.Current.Request.Form[key];
}
Run Code Online (Sandbox Code Playgroud)
什么是上述代码的.net核心版本?好像.net核心取出AllKeys并用Keys代替它.我试图将上面的代码转换为.net核心方式,但它抛出了无效的操作异常.
HttpContext.Request.Form ='HttpContext.Request.Form'抛出类型'System.InvalidOperationException'的异常
转换代码:
foreach (string key in HttpContext.Request.Form.Keys)
{
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一些中间件,并且需要知道当前的操作方法(如果有)是否具有特定的过滤器属性,因此我可以根据其存在来更改行为。
因此,是否有可能IList<IFilterMetadata>像在ResourceExecutingContext实现a时所做的那样获取类型的过滤器集合IResourceFilter?
c# httpcontext asp.net-core-mvc asp.net-core asp.net-core-middleware
我有一个简单的控制器动作,看起来像:
public Task<IEnumerable<Data>> GetData()
{
IEnumerable<Data> data = new List<Data>();
return data;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够从中间件中检查返回值,以便JSON看起来像
{
"data": [
],
"apiVersion": "1.2",
"otherInfoHere": "here"
}
Run Code Online (Sandbox Code Playgroud)
所以我的有效载荷总是在data.我知道我可以在控制器级别执行此操作,但我不想在每个操作上执行此操作.我宁愿一次性在中间件中做到这一点.
这是我的中间件的一个例子:
public class NormalResponseWrapper
{
private readonly RequestDelegate next;
public NormalResponseWrapper(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context)
{
var obj = context;
// DO something to get return value from obj
// Create payload and set data to return value
await context.Response.WriteAsync(/*RETURN NEW PAYLOAD HERE*/);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
现在有了价值,但要归还它是迟到的
try …Run Code Online (Sandbox Code Playgroud) 我想在.net核心中获取Http Request主体,我使用了以下代码:
using (var reader
= new StreamReader(req.Body, Encoding.UTF8))
{
bodyStr = reader.ReadToEnd();
}
req.Body.Position = 0
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个错误:
System.ObjectDisposedException:无法访问已处置的对象。对象名称:“ FileBufferingReadStream”。
该行的using语句后发生错误
如何在.net核心中获取HttpRequest主体?以及如何解决此错误?
httpcontext ×10
c# ×5
asp.net ×3
asp.net-core ×3
.net ×2
asp.net-mvc ×2
.net-core ×1
httprequest ×1
middleware ×1
nhibernate ×1
pipeline ×1
streamreader ×1