我正在使用伪造的 HttpContext (最后提供的代码),可能我错过了一些东西,因为我无法访问 TempData 集合(SetFakeControllerContext 方法的第四行)。每次我尝试时都会收到此错误消息:
“controller.TempData”引发了“System.AccessViolationException”类型的异常
调用FakeHttpContext的代码是:
public static void SetFakeControllerContext(this Controller controller)
{
HttpContextBase httpContext = FakeHttpContext(string.Empty);
var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;
controller.TempData = new TempDataDictionary(); //This is not necessary! It was just a test!!!!
}
Run Code Online (Sandbox Code Playgroud)
有人知道我做错了什么吗?
public static HttpContextBase FakeHttpContext(string username){
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
var user = new …Run Code Online (Sandbox Code Playgroud) 我需要访问请求上下文,特别是我的自定义类中的 Items,我不想让它从ServiceStackService继承或在我的 Service 中设置它。
因此,如果我有一个类似下面的类,实现者类 ( ContextItemsGetter) 也实现了IRequiresRequest,我希望该Request属性被填充。
public interface IGetContextItems
{
string Get(string key);
}
public class ContextItemsGetter : IGetContextItems, IRequiresRequest
{
public string Get(string key)
{
//someway to access http context items
//im RequestContext.Instance.Items[key] e.g. Prop1 Prop2
//or Request.blah but Request is always null
}
public IRequest Request { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是,当从真正的HTTP 请求或redis 消息请求调用 SessionIdGetter 时,请求始终为空。难道我做错了什么?目的是解耦,使用Items在http请求和redis消息请求之间传递信息。
我还尝试使用 RequestContext.Instance.Items,这适用于 HTTP 请求,但在 redis 消息请求期间,项目不存在,我在调用 ExecuteMessage 之前填充的键不存在。 …
我需要访问HttpContext.CurrentASP.NET Core 2.2 中的类库
HttpContext.Current.Request.Url.ToString().Contains("SAMLart")
Run Code Online (Sandbox Code Playgroud)
当我尝试仅尝试使用 HomeController 中的方法时,我正在尝试移植代码,但在主 Web 项目中HttpContext甚至没有移植代码。Current
c# httpcontext asp.net-core-mvc asp.net-core asp.net-core-2.0
我尽可能地遵循 AzureAD aspnetcore 示例,尝试在我们的 aspnetcore 2.2 webapp 中实现 Azure AD 身份验证。我可以使用 Azure AD 成功登录。但是,登录后不会显示用户名。
https://github.com/Azure-Samples/active-directory-b2c-dotnetcore-webapp
该值应该从 User.Identity.Name 属性的视图中读取。
在进一步检查中,我可以看到主要索赔已正确返回到应用程序。但是,由于某种原因 HttpContext.User 对象未正确填充。我不知道为什么会这样。当我从上面的示例中查看相同的值时,HttpContext 设置正确。为了澄清起见,我已经实现了 OnSecurityTokenValidated 处理程序并使用了以下上下文:
可以看出, userPrincipal 具有预期的声明。
但是,httpContext 没有声明。因此 User.Identity.Name 也为空:
我试图进行手动登录,但这也不起作用:
private async Task SignInUser(TokenValidatedContext tokenValidatedContext)
{
var httpContext = tokenValidatedContext.HttpContext;
var userPrincipal = tokenValidatedContext.Principal;
await httpContext.SignOutAsync(AppSettings.CookieName);
await httpContext.SignInAsync(AppSettings.CookieName, userPrincipal,
new AuthenticationProperties
{
ExpiresUtc = DateTime.UtcNow.AddDays(1),
IsPersistent = false,
AllowRefresh = false
});
}
Run Code Online (Sandbox Code Playgroud)
更新
我正在设置 NameClaimType,如上所示。NameClaimType 在配置中设置
任何人都知道我做错了什么?
我正在使用 Visual Studio 2017 和 aspnetcore 2.2 库。我已将 Microsoft.Identity.Client 升级到 …
c# httpcontext claims-based-identity azure-ad-b2c asp.net-core
我正在尝试使用Jason Taylor 的 Clean Architecture Template,这个模板使用 NSwag 自动创建一个 TypeScript 客户端(Angular),但我不需要创建一个 TS 客户端,所以我的主要目标是用 Razor Pages 替换它。我已经能够做到这一点,但当CurrentUserService被实例化时,我遇到了问题,它应该在这一行中设置 UserId:
UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
Run Code Online (Sandbox Code Playgroud)
这是完整的CurrentUserService:
using CleanREC0.Application.Common.Interfaces;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;
namespace CleanREC0.WebUI.Services
{
public class CurrentUserService : ICurrentUserService
{
public CurrentUserService(IHttpContextAccessor httpContextAccessor)
{
UserId = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier);
}
public string UserId { get; }
}
}
Run Code Online (Sandbox Code Playgroud)
第一次甚至 HttpContext 为空,这很好,因为一切都在初始化,但随后的调用总是在所有httpContextAccessor.HttpContext.User.Identity属性上返回null,用户显示了一个身份,但它的所有属性和声明都是null或Yield no results,即使用户正确登录。
这是我对模板所做的事情的列表:
c# identity dependency-injection httpcontext clean-architecture
我正在尝试为我的控制器类编写单元测试,它使用以下命令检索令牌:
string token = await HttpContext.GetTokenAsync("access_token");
Run Code Online (Sandbox Code Playgroud)
因此,我用以下代码模拟了 HttpContext:
public static HttpContext MakeFakeContext()
{
var serviceProvider = new Mock<IServiceProvider>();
var authservice = new Mock<IAuthenticationService>();
authservice.Setup(_ => _.GetTokenAsync(It.IsAny<HttpContext>(), It.IsAny<string>())).Returns(Task.FromResult("token"));
serviceProvider.Setup(_ => _.GetService(typeof(IAuthenticationService))).Returns(authservice);
return new DefaultHttpContext
{
RequestServices = serviceProvider.Object
};
}
Run Code Online (Sandbox Code Playgroud)
我正在设置模拟上下文:
var mockcontext = MakeFakeContext();
unitUnderTest.ControllerContext = new ControllerContext
{
HttpContext = mockcontext
};
Run Code Online (Sandbox Code Playgroud)
现在,当我运行单元测试时,出现以下错误:
System.NotSupportedException:不支持的表达式:_ => _.GetTokenAsync(It.IsAny(), It.IsAny()) 扩展方法(此处:AuthenticationTokenExtensions.GetTokenAsync)不能用于设置/验证表达式。
在我的研究过程中,我偶然发现了一些解决方案,您可以在其中模拟引擎盖下不属于扩展的特定部分。这些是其中一些:Moq IServiceProvider / IServiceScope,如何对 HttpContext.SignInAsync() 进行单元测试?. 第二个显示了类似的问题,在我尝试后似乎有效。但由于某种原因,它不适用于 GetTokenAsync 方法。
大家有什么提示吗?
我正在尝试HttpContext.Session在我的 ASP.NET Core Blazor Server 应用程序中使用(如本MS Doc 中所述,我的意思是:在启动时全部正确设置)
这是我尝试设置值时的代码部分:
var session = _contextAccessor.HttpContext?.Session;
if (session != null && session.IsAvailable)
{
session.Set(key, data);
await session.CommitAsync();
}
Run Code Online (Sandbox Code Playgroud)
当这个代码在剃刀称为组件OnAfterRenderAsync的session.Set抛出以下异常:
响应开始后无法建立会话。
我(可能)理解该消息,但这使得 Session 基础设施非常不可用:应用程序需要在执行的每个阶段访问其状态......
题
我应该完全忘记DistributedSession基础设施,而去使用 Cookies 或浏览器 SessionStorage 吗?...或者这里是否有解决方法仍在使用HttpContext.Session?我不想只是为了较低级别的实现而放弃分布式会话基础设施......
(仅供参考:浏览器的会话存储不是跨选项卡,这很痛苦)
我有一个存储会话变量的应用程序.当我进行注销时,我在可用会话上调用RemoveAll()方法.
该方法似乎不起作用.你知道如何强制删除Session变量吗?
问候.
我有一个MVC3应用程序,我已经添加了几个简单的缓存变量作为属性.我添加了我的数据,Application_Start然后在控制器中尝试将其转换HttpContext.ApplicationInstance回我的类型以访问它.但是,该属性始终为null.这是一个例子:
编辑工作实例
public interface IMyMvcApp
{
Hashtable Cache {get;set;}
}
public class MvcApplication: HttpApplication, IMyMvcApp
{
public Hashtable Cache
{
get { return Context.Cache["MyStuff"] as Hashtable; }
set { Context.Cache["MyStuff"] = value}
}
public void Application_Start()
{
Cache = new Hashtable();
Cache.Add("key", new object());
}
}
public class AController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext context)
{
var myApp = context.HttpContext.ApplicationInstance as IMyMvcApp;
Assert.IsNotNull(myApp.Cache);
}
}
Run Code Online (Sandbox Code Playgroud) Response.End()生成ThreadAbortException.
用HttpContext.Current.ApplicationInstance.CompleteRequest它代替它并不能解决问题.
那么,我们可以使用Response.Flush()而不是Response.End()
httpcontext ×10
c# ×8
asp.net-core ×3
asp.net ×2
moq ×2
session ×2
asp.net-mvc ×1
azure-ad-b2c ×1
class ×1
identity ×1
mocking ×1
response ×1
servicestack ×1
tempdata ×1
unit-testing ×1
xunit ×1