Как в Blazor считать headers из запроса?
Подскажите, пожалуйста, как на данной странице считать заголовки (headers) запроса? И есть ли такая функциональность в Blazor для считывания заголовков?
@page "/"
@inject NavigationManager navigationManager;
<div class="section">
</div>
@code {
private string sid;
protected override async Task OnInitializedAsync()
{
getQueryStringValues();
}
private void getQueryStringValues()
{
navigationManager.TryGetQueryString("SID", out sid);
}
}
Ответы (2 шт):
Автор решения: Russo
→ Ссылка
В настройках сервиса добавляем службу HttpContextAccessor:
builder.Services.AddHttpContextAccessor();
И затем вытаскиваем необходимый заголовок из запроса:
@inject IHttpContextAccessor httpContextAccessor;
@code {
private string needParameter { get; set; }
protected override async Task OnInitializedAsync()
{
needParameter = httpContextAccessor.HttpContext.Request.Headers["parameterName"];
}
}
Автор решения: Russo
→ Ссылка
Оказалось, что такой способ не рекомендуется использовать, подробнее тут. Поэтому нашел другой способ. В _Host.cshtml файле необходимо передать параметр с данными, которые вам необходимы, в моем случае это Dictionary<string, string> хедеров:
<body>
<app>
<component type="typeof(App)" render-mode="Server"
param-RequestData="@(new RequestData
{
Headers = Request.Headers.Select(t =>
new KeyValuePair<string, string>(t.Key, t.Value))
.ToDictionary(t => t.Key, t => t.Value)
})"/>
</app>
</body>
После в App настроить передачу каскадного значение в App.razor:
<CascadingValue Value="RequestData">
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
</Found>
<NotFound>
<NavigateToNotFound/>
</NotFound>
</Router>
</CascadingValue>
@code {
[Parameter]
public RequestData RequestData { get; set; }
}
А дальше используем каскадный параметр на любой странице, где он нужен:
@page "/some-url"
@code {
[CascadingParameter]
public RequestData Request { get; set; }
}
Модель RequestData:
public class RequestData
{
public Dictionary<string, string> Headers { get; set; }
}