Для получения всей информации о запросе в компонентах middleware используется свойство Request объекта HttpContext, которое представляет объект HttpRequest и хранит данные запроса в следующих свойствах:
Body: предоставляет тело запроса в виде объекта Stream
BodyReader: возвращает объект типа PipeReader для чтения тела запроса
ContentLength: получает или устанавливает заголовок Content-Length
ContentType: получает или устанавливает заголовок Content-Type
Cookies: возвращает коллекцию куки (объект Cookies), ассоциированных с данным запросом
Form: получает или устанавливает тело запроса в виде форм
HasFormContentType: проверяет наличие заголовка Content-Type
Headers: возвращает заголовки запроса
Host: получает или устанавливает заголовок Host
HttpContext: возвращает связанный с данным запросом объект HttpContext
IsHttps: возвращает true
, если применяется протокол https
Method: получает или устанавливает метод HTTP
Path: получает или устанавливает путь запроса в виде объекта RequestPath
PathBase: получает или устанавливает базовый путь запроса. Такой путь не должен содержать завершающий слеш
Protocol: получает или устанавливает протокол, например, HTTP
Query: возвращает коллекцию параметров из строки запроса
QueryString: получает или устанавливает строку запроса
RouteValues: получает данные маршрута для текущего запроса
Scheme: получает или устанавливает схему запроса HTTP
Рассмотрим применение некоторых из этих свойств.
Для получения заголовков применяется свойство Headers, которое представляет тип IHeaderDictionary. Например, получим все заголовки запроса и выведем их на веб-страницу:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task context.Response.ContentType = "text/html; charset=utf-8" Dim stringBuilder = New Text.StringBuilder("<table>") For Each header In context.Request.Headers stringBuilder.Append($"<tr><td>{header.Key}</td><td>{header.Value}</td></tr>") Next stringBuilder.Append("</table>") Await context.Response.WriteAsync(stringBuilder.ToString()) End Function) app.Run() End Sub End Module
Для большинства стандартных заголовков HTTP в этом интерфейсе определены одноименные свойства, например, для заголовка "content-type" определено свойство ContentType
,
а для заголовка "accept" - свойство Accept
:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task Dim acceptHeaderValue = context.Request.Headers.Accept Await context.Response.WriteAsync($"Accept: {acceptHeaderValue}") End Function) app.Run() End Sub End Module
Также подобые заголовки, а также какие-то кастомные заголовки, для которых не определены подобные свойства, можно получить как и любой дугой элемент словаря:
Dim acceptHeaderValue = context.Request.Headers("accept")
Для ряда заголовков в классе HttpRequest определены отдельные свойства: Host, Method, ContentType, ContentLength.
Свойство path позволяет получить запрошенный путь, то есть адрес, к которому обращается клиент:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task Await context.Response.WriteAsync($"Path: {context.Request.Path}") End Function) app.Run() End Sub End Module
Это свойство позволяет нам узнать, по какому адресу обращается пользователю. Например, мы можем определить условную обработку запроса в зависимости от запрошенного адреса:
Свойство path позволяет получить запрошенный путь, то есть адрес, к которому обращается клиент:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task Dim path = context.Request.Path.Value Dim response = context.Response If path = "/date" Then Await response.WriteAsync($"Date: {Now.ToShortDateString()}") ElseIf path = "/time" Then Await response.WriteAsync($"Time: {Now.ToShortTimeString()}") Else Await response.WriteAsync("Hello METANIT.COM") End If End Function) app.Run() End Sub End Module
В данном случае, если пользователь обращается по адресу "/date", то ему отображается текущая дата, а если обращается по адресу "/time" - текущее время. В остальных случаях отображается некоторое универсальное сообщение:
Подобным образом можно определить свою систему маршрутизации, однако в ASP.NET Core по умолчанию есть инструменты, которые проще использовать для создания системы маршрутизации в приложении и которые будут рассмотрены в последующих статьях.
Свойство QueryString позволяет получить строку запроса. Строка запроса представляет ту часть запрошенного адреса, которая идет после символа ? и представляет набор параметров, разделенных символом амперсанда &:
?параметр1=значение1&параметр2=значение2&параметр3=значение3
Каждому параметру с помощью знака равно передается некоторое значение.
Стоит отметить, что строка запроса (query string) НЕ входит в путь запроса (path):
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task context.Response.ContentType = "text/html; charset=utf-8" Await context.Response.WriteAsync($"<p>Path: {context.Request.Path}</p>" + $"<p>QueryString: {context.Request.QueryString}</p>") End Function) app.Run() End Sub End Module
Так, в данном случае идет обращение по адресу
https://localhost:7256/users?name=Tom&age=37
Путь запроса или path представляет ту часть адреса, которая идет после домена/порта и до символа ?.
/users
Строка запроса или query string представляет ту часть адреса, которая идет начиная с символа ?.
?name=Tom&age=37
То есть в данном случае через строку запроса передаются два параметра. Первый параметр - name
имеет значение "Tom". Bторой параметр - age
имеет значение 37.
С помощью свойства Query можно получить все параметры строки запроса в виде словаря:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task context.Response.ContentType = "text/html; charset=utf-8" Dim stringBuilder = New Text.StringBuilder("<h3>Параметры строки запроса</h3><table>") stringBuilder.Append("<tr><td>Параметр</td><td>Значение</td></tr>") For Each param In context.Request.Query stringBuilder.Append($"<tr><td>{param.Key}</td><td>{param.Value}</td></tr>") Next stringBuilder.Append("</table>") Await context.Response.WriteAsync(stringBuilder.ToString()) End Function) app.Run() End Sub End Module
Соответственно можно вытащить из словаря Query значения отдельных параметров:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task Dim name = context.Request.Query("name") Dim age = context.Request.Query("age") Await context.Response.WriteAsync($"{name} - {age}") End Function) app.Run() End Sub End Module