我在asp.net proj中有一个类,我想从站点的任何地方访问GetGlobalResourceObject(那个页面公开),可能吗?
换句话说,我想从一个不是我不关心的页面的类中访问全局资源.
我想要为每个请求缓存用户所处的角色.在任何给定页面中有几个地方我们有类似的地方:
<% if(Roles.IsUserInRole("RoleName")) {%>
<!-- Conditional Rendering -->
<% } else if(Roles.IsUserInRole("AnotherRole") {%>
<!-- You get the point -->
<% } %>
Run Code Online (Sandbox Code Playgroud)
由于这都存储在sql数据库中,因此每个请求都会访问数据库.我知道有办法在cookie中缓存角色,但我不想这样做.无论如何,我在想的是这样的.
public static class SecurityUtils
{
public static string[] UserRoles()
{
var context = HttpContext.Current;
if (context == null) return Enumerable.Empty<string>();
string[] roles;
roles = context.Items["UserRoles"] as string[];
if (roles == null)
{
roles = Roles.GetRolesForUser();
context.Items["UserRoles"] = roles;
}
return roles;
}
}
Run Code Online (Sandbox Code Playgroud)
有人看到任何问题吗?我知道有人会打电话来UserRoles()查找上下文中的项目,也许这不是最有效的事情.我真正想知道的是,这是否会基于每个请求缓存它,因此与其他用户请求没有重叠.
public static class HttpRequestHelper
{
public static string RequestBody()
{
var bodyStream = new StreamReader(HttpContext.Current.Request.InputStream);
bodyStream.BaseStream.Seek(0, SeekOrigin.Begin);
var bodyText = bodyStream.ReadToEnd();
return bodyText;
}
}
Run Code Online (Sandbox Code Playgroud)
我打算从ActionFilters中调用它来记录传入的请求.当然可能有多个同时发出的请求.
这种方法可以吗?
我正在尝试编写一个Web API方法的测试,该方法使用HttpContext.Current.Request.Files并经过详尽的搜索和实验后,我无法弄清楚如何模拟它.正在测试的方法如下所示:
[HttpPost]
public HttpResponseMessage Post()
{
var requestFiles = HttpContext.Current.Request.Files;
var file = requestFiles.Get(0);
//do some other stuff...
}
Run Code Online (Sandbox Code Playgroud)
如果我试图模拟上下文,我会遇到Http*对象层次结构的问题.假设我设置了各种模拟对象(使用Moq),如下所示:
var mockFiles = new Mock<HttpFileCollectionBase>();
mockFiles.Setup(s => s.Count).Returns(1);
var mockFile = new Mock<HttpPostedFileBase>();
mockFile.Setup(s => s.InputStream).Returns(new MemoryStream());
mockFiles.Setup(s => s.Get(It.IsAny<int>())).Returns(mockFile.Object);
var mockRequest = new Mock<HttpRequestBase>();
mockRequest.Setup(s => s.Files).Returns(mockFiles.Object);
var mockContext = new Mock<HttpContextBase>();
mockContext.Setup(s => s.Request).Returns(mockRequest.Object);
Run Code Online (Sandbox Code Playgroud)
试图将其分配给当前上下文...
HttpContext.Current = mockContext.Object;
Run Code Online (Sandbox Code Playgroud)
...导致编译器错误/红线,因为它Cannot convert source type 'System.Web.HttpContextBase' to target …
我们希望将我们的项目从ASP.NET MVC 2升级到3.我们的大多数测试都成功了,但有些测试失败了ValueProviderFactories.Factories.GetValueProvider(context).
这是一个简单的测试类,用于解决问题.
[TestFixture]
public class FailingTest
{
[Test]
public void Test()
{
var type = typeof(string);
// any controller
AuthenticationController c = new AuthenticationController();
var httpContext = new Mock<HttpContextBase>();
var context = c.ControllerContext = new ControllerContext(httpContext.Object, new RouteData(), c);
IModelBinder converter = ModelBinders.Binders.GetBinder(type);
var bc = new ModelBindingContext
{
ModelName = "testparam",
ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, type),
ValueProvider = ValueProviderFactories.Factories.GetValueProvider(context)
};
Console.WriteLine(converter.BindModel(context, bc));
}
}
Run Code Online (Sandbox Code Playgroud)
异常"对象引用未设置为对象的实例." ValueProviderFactories.Factories.GetValueProvider(context)被叫时被抛出.stacktrace看起来像这样:
Microsoft.Web.Infrastructure.dll!Microsoft.Web.Infrastructure.DynamicValidationHelper.ValidationUtility.CollectionReplacer.GetUnvalidatedCollections(System.Web.HttpContext context) + 0x23 bytes
Microsoft.Web.Infrastructure.dll!Microsoft.Web.Infrastructure.DynamicValidationHelper.ValidationUtility.GetUnvalidatedCollections(System.Web.HttpContext context, out System.Collections.Specialized.NameValueCollection …Run Code Online (Sandbox Code Playgroud) 这里的帖子中有人评论说在使用MVC时不应该使用HttpContext.Current,而是应该使用ControllerBase.ControllerContext.在某些方面,这是有道理的,但在其他方面却没有.
例如,ControllerContext是一个实例变量,所以在我想引用的所有地方,比如我的Session变量,我需要有一个对Controller的引用?为什么我们"不应该"在MVC中使用HttpContext.Current,当你还可以的时候?是否有一个"适当的"MVC"方式"来获取我的Session对象而无需引用Controller?
我知道测试方面,它更好的原因在许多其他地方说明,但我正在研究一个管理Session变量和引用HttpContext.Current的项目,我想知道是否有更好的方法来获取Session对象没有传递对控制器的引用.
我正在阅读一篇关于HttpContext和CallContext的文章,看看线程敏捷性.这是什么意思?
我正在尝试在我的MVC应用程序上运行一些测试,但是我一直在经历一个让它运行起来的世界.我会尽力做到这一点:
我正在使用RhinoMocks尝试这样的事情:
建立:
MockRepository mocks = new MockRepository();
HttpContextBase _mockContext = mocks.FakeHttpContext();
mocks.SetFakeControllerContext(new LoginController());
HttpApplicationStateBase appState = MockRepository.GenerateStub<HttpApplicationStateBase>();
_mockContext.Expect(mc => mc.Application).Return(appState);
HttpContext.Current = _mockContext.ApplicationInstance.Context;
Run Code Online (Sandbox Code Playgroud)
这是FakeHttpContext()方法:
public static HttpContextBase FakeHttpContext(this MockRepository mocks)
{
HttpApplication app = mocks.PartialMock<HttpApplication>();
HttpContextBase context = mocks.PartialMock<HttpContextBase>();
HttpRequestBase request = mocks.PartialMock<HttpRequestBase>();
HttpResponseBase response = mocks.PartialMock<HttpResponseBase>();
HttpSessionStateBase session = mocks.PartialMock<HttpSessionStateBase>();
HttpServerUtilityBase server = mocks.PartialMock<HttpServerUtilityBase>();
SetupResult.For(context.ApplicationInstance).Return(app);
SetupResult.For(context.Request).Return(request);
SetupResult.For(context.Response).Return(response);
SetupResult.For(context.Session).Return(session);
SetupResult.For(context.Server).Return(server);
mocks.Replay(context);
return context;
}
Run Code Online (Sandbox Code Playgroud)
我真的需要访问,HttpContextBase.Request.AppRelativeCurrentExecutionFilePath但它总是返回null.同样的道理HttpContext.Current.Request.RequestContext.
有人可以帮帮我吗?可以肯定地说,我现在绝望了.
我正在尝试将 Razor 视图呈现为来自托管服务的字符串。通过使用,IRazorViewEngine我可以使用如下所示的方式将视图呈现为字符串:
_viewEngine.FindView(actionContext, viewName, false);
var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = model
};
var viewContext = new ViewContext(
actionContext,
viewResult.View,
viewDictionary,
new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
sw,
new HtmlHelperOptions()
);
viewContext.RouteData = httpContext.GetRouteData(); //set route data here
await viewResult.View.RenderAsync(viewContext);
Run Code Online (Sandbox Code Playgroud)
但是,当Controller由于缺少而没有从 a 调用时,这会崩溃HttpContext。我尝试手动构建 HttpContext,但在 Microsoft Mvc 代码深处遇到许多错误和空异常,这极难调试。我尝试过像RazorLight这样的库,它不适合我的需求,因为它不能正确支持@inject指令。我认为我最好的解决方案是尝试模拟一个假的 HttpContext/ControllerContext 以传递给本机 ViewEngine。但是,当我创建一个 new 时DefaultHttpContext,我在此处得到一个 NullReferenceException ,但是很难跟踪代码并找到它的来源。
有没有办法创建一个新的 HttpContext?
我知道在 asp.net-core 2.2 中,我可以按如下方式获取操作名称:
ControllerContext.ActionDescriptor.ActionName
Run Code Online (Sandbox Code Playgroud)
但我正在寻找一种方法来获取 asp.net-core 2.2 中当前请求/页面的控制器名称
我将不胜感激任何指南。
谢谢
httpcontext ×10
c# ×7
asp.net ×4
asp.net-mvc ×3
controller ×2
moq ×2
unit-testing ×2
.net ×1
asp.net-core ×1
http-headers ×1
resources ×1
threadpool ×1