首先定義函數(shù)
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。
項目規(guī)模起來的話,為了適當減少工作量。
同時避免個別開發(fā)人員不調(diào)用共通方法,直接把部署名拼到URL上。
對Ajax的設定做如下修正。可以解決上述的兩個問題。
// ================================================
// HTML的文檔對象模型 (DOM)加載完后,執(zhí)行的內(nèi)容
// ================================================
$(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()的內(nèi)容
<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;
}
調(diào)用Ajax的方法
SP.NET Core 應用通過 IHttpContextAccessor 接口及其默認實現(xiàn) HttpContextAccessor 訪問 HttpContext。 只有在需要訪問服務內(nèi)的 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 的其他框架和自定義組件,建議使用內(nèi)置的依賴項注入容器來注冊依賴項。 依賴項注入容器向任意類提供 IHttpContextAccessor,以供類在自己的構(gòu)造函數(shù)中將它聲明為依賴項:
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 不是線程安全型。 在處理請求之外讀取或?qū)懭?HttpContext 的屬性可能會導致 NullReferenceException。
備注
如果應用生成偶發(fā)的 NullReferenceException 錯誤,請評審啟動后臺處理的部分代碼,或者在請求完成后繼續(xù)處理的部分代碼。 查找諸如將控制器方法定義為 async void 的錯誤。
要使用 HttpContext 數(shù)據(jù)安全地執(zhí)行后臺工作,請執(zhí)行以下操作:
要避免不安全代碼,請勿將 HttpContext 傳遞給執(zhí)行后臺工作的方法。 而是傳遞所需要的數(shù)據(jù)。 在以下示例中,調(diào)用 SendEmailCore,開始發(fā)送電子郵件。 將 correlationId 傳遞到 SendEmailCore,而不是 HttpContext。 代碼執(zhí)行不會等待 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 服務器應用位于服務器內(nèi)存中。 這意味著同一進程中托管了多個應用。 對于每個應用會話,Blazor 會啟動具有其自己的 DI 容器作用域的線路。 這意味著,每個 Blazor 會話的作用域內(nèi)服務都是唯一的。
警告
我們不建議同一服務器上的應用共享使用單一實例服務的狀態(tài),除非采取了極其謹慎的措施,因為這可能會帶來安全漏洞,如跨線路泄露用戶狀態(tài)。
如果有狀態(tài)的單一實例服務是專門為 Blazor 應用設計的,則可以在該應用中使用這些服務。 例如,假設用戶無法控制使用哪些緩存密鑰,則可以將內(nèi)存緩存用作單一實例,因為它需要一個密鑰來訪問給定的條目。
另外,出于安全原因,不得在 Blazor 應用中使用 IHttpContextAccessor 。 Blazor 應用在 ASP.NET Core 管道的上下文之外運行。 HttpContext 既不保證在 IHttpContextAccessor 中可用,也不保證它會保留啟動了 Blazor 應用的上下文。
若要向 Blazor 應用傳遞請求狀態(tài),建議在初次呈現(xiàn)應用時通過傳遞到根組件的參數(shù)進行傳遞:
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。