首先定义函数
function getContextPath() {
var pathName = document.location.pathname;
var index = pathName.substr(1).indexOf("/");
var result = pathName.substr(0,index+1);
return result;
}
在引用的时候,路径前加上getContextPath(),例如:
端在做Ajax请求时,
如果用Jquery提供的Ajax,那么每次都要设定URL的部署名ContextPath。
项目规模起来的话,为了适当减少工作量。
同时避免个别开发人员不调用共通方法,直接把部署名拼到URL上。
对Ajax的设定做如下修正。可以解决上述的两个问题。
// ================================================
// HTML的文档对象模型 (DOM)加载完后,执行的内容
// ================================================
$(function() {
//ajax初始化
$.ajaxSetup({
type: "POST",
dataType: "json",
contentType: "application/json",
async: false,
extraUrl: null,
extraBeforeSend: null,
beforeSend: function(jqXHR, settings) {
if (settings.type && settings.type.toUpperCase() == "POST") {
// 设置HTTP请求头部
var headerName = $("meta[name='_csrf_header']").attr("content");
var tokenValue = $("meta[name='_csrf']").attr("content");
jqXHR.setRequestHeader(headerName, tokenValue);
}
// 设定部署名ContextPath
if (($.trim(settings.extraUrl)).length > 0) {
if (settings.type.toUpperCase() == "GET" && settings.url.indexOf('?') > 0) {
settings.url = getContextPath() + settings.extraUrl + settings.url.substring(settings.url.indexOf('?'));
} else {
settings.url = getContextPath() + settings.extraUrl;
}
}
if (typeof settings.extraBeforeSend === "function") {
settings.extraBeforeSend.call(this, jqXHR, settings);
}
}
});
});
共通方法getContextPath()的内容
<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/
thContextPath = /*[[@{/}]]*/'';
/*]]>*/
function getContextPath() {
return thContextPath;
}
</script>
或者
//HTML代码
<input type="hidden" id="contextPath" th:value="@{/}" />
//js代码
function getContextPath() {
var contextPath = document.getElementById("contextPath");
if (contextPath == null) return "/";
return contextPath.value;
}
调用Ajax的方法
SP.NET Core 应用通过 IHttpContextAccessor 接口及其默认实现 HttpContextAccessor 访问 HttpContext。 只有在需要访问服务内的 HttpContext 时,才有必要使用 IHttpContextAccessor。
Razor Pages PageModel 公开 HttpContext 属性:
C#复制
public class AboutModel : PageModel
{
public string Message { get; set; }
public void OnGet()
{
Message = HttpContext.Request.PathBase;
}
}
相同的属性可在相应的 Razor 页面视图中使用
CSHTML复制
@page
@model AboutModel
@{
var message = HttpContext.Request.PathBase;
...
}
MVC 模式中的 Razor 视图通过视图上的 RazorPage.Context 属性公开 HttpContext。 下面的示例使用 Windows 身份验证检索 Intranet 应用中的当前用户名:
CSHTML复制
@{
var username = Context.User.Identity.Name;
...
}
控制器公开 ControllerBase.HttpContext 属性:
C#复制
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
...
return View();
}
}
使用自定义中间件组件时,HttpContext 传递到 Invoke 或 InvokeAsync 方法,在中间件配置后可供访问:
public class MyCustomMiddleware
{
public Task InvokeAsync(HttpContext context)
{
...
}
}
对于需要访问 HttpContext 的其他框架和自定义组件,建议使用内置的依赖项注入容器来注册依赖项。 依赖项注入容器向任意类提供 IHttpContextAccessor,以供类在自己的构造函数中将它声明为依赖项:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddHttpContextAccessor();
services.AddTransient<IUserRepository, UserRepository>();
}
如下示例中:
public class UserRepository : IUserRepository
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserRepository(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void LogCurrentUser()
{
var username = _httpContextAccessor.HttpContext.User.Identity.Name;
service.LogAccessRequest(username);
}
}
HttpContext 不是线程安全型。 在处理请求之外读取或写入 HttpContext 的属性可能会导致 NullReferenceException。
备注
如果应用生成偶发的 NullReferenceException 错误,请评审启动后台处理的部分代码,或者在请求完成后继续处理的部分代码。 查找诸如将控制器方法定义为 async void 的错误。
要使用 HttpContext 数据安全地执行后台工作,请执行以下操作:
要避免不安全代码,请勿将 HttpContext 传递给执行后台工作的方法。 而是传递所需要的数据。 在以下示例中,调用 SendEmailCore,开始发送电子邮件。 将 correlationId 传递到 SendEmailCore,而不是 HttpContext。 代码执行不会等待 SendEmailCore 完成:
public class EmailController : Controller
{
public IActionResult SendEmail(string email)
{
var correlationId = HttpContext.Request.Headers["x-correlation-id"].ToString();
_ = SendEmailCore(correlationId);
return View();
}
private async Task SendEmailCore(string correlationId)
{
...
}
}
Blazor 服务器应用位于服务器内存中。 这意味着同一进程中托管了多个应用。 对于每个应用会话,Blazor 会启动具有其自己的 DI 容器作用域的线路。 这意味着,每个 Blazor 会话的作用域内服务都是唯一的。
警告
我们不建议同一服务器上的应用共享使用单一实例服务的状态,除非采取了极其谨慎的措施,因为这可能会带来安全漏洞,如跨线路泄露用户状态。
如果有状态的单一实例服务是专门为 Blazor 应用设计的,则可以在该应用中使用这些服务。 例如,假设用户无法控制使用哪些缓存密钥,则可以将内存缓存用作单一实例,因为它需要一个密钥来访问给定的条目。
另外,出于安全原因,不得在 Blazor 应用中使用 IHttpContextAccessor 。 Blazor 应用在 ASP.NET Core 管道的上下文之外运行。 HttpContext 既不保证在 IHttpContextAccessor 中可用,也不保证它会保留启动了 Blazor 应用的上下文。
若要向 Blazor 应用传递请求状态,建议在初次呈现应用时通过传递到根组件的参数进行传递:
*请认真填写需求信息,我们会在24小时内与您取得联系。