|
将Giraffe添加到 ASP.NET Core
使用Nuget安装 Giraffe包:
PM> Install-Package Giraffe创建一个 Web 应用程序并将其插入 ASP.NET Core 中间件:
open Giraffe
let webApp =
choose [
route "/ping" >=> text "pong"
route "/" >=> htmlFile "/pages/index.html" ]
type Startup() =
member __.ConfigureServices (services : IServiceCollection) =
// Register default Giraffe dependencies
services.AddGiraffe() |> ignore
member __.Configure (app : IApplicationBuilder)
(env : IHostingEnvironment)
(loggerFactory : ILoggerFactory) =
// Add Giraffe to the ASP.NET Core pipeline
app.UseGiraffe webApp
[<EntryPoint>]
let main _ =
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(
fun webHostBuilder ->
webHostBuilder
.UseStartup<Startup>()
|> ignore)
.Build()
.Run()
0除了创建 Startup 类之外,您还可以以更实用的方式添加 Giraffe:
open Giraffe
let webApp =
choose [
route &#34;/ping&#34; >=> text &#34;pong&#34;
route &#34;/&#34; >=> htmlFile &#34;/pages/index.html&#34; ]
let configureApp (app : IApplicationBuilder) =
// Add Giraffe to the ASP.NET Core pipeline
app.UseGiraffe webApp
let configureServices (services : IServiceCollection) =
// Add Giraffe dependencies
services.AddGiraffe() |> ignore
[<EntryPoint>]
let main _ =
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(
fun webHostBuilder ->
webHostBuilder
.Configure(configureApp)
.ConfigureServices(configureServices)
|> ignore)
.Build()
.Run()
0
依赖管理
ASP.NET Core 内置了依赖管理,可以与 Giraffe 一起开箱即用。
注册服务
注册服务的方式与任何其他 ASP.NET Core Web 应用程序的方式相同:
let configureServices (services : IServiceCollection) =
// Add default Giraffe dependencies
services.AddGiraffe() |> ignore
// Add other dependencies
// ...
[<EntryPoint>]
let main _ =
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(
fun webHostBuilder ->
webHostBuilder
.Configure(configureApp)
// Calling ConfigureServices to set up dependencies
.ConfigureServices(configureServices)
.ConfigureLogging(configureLogging)
|> ignore)
.Build()
.Run()
0检索服务
从 Giraffe HttpHandler 函数中检索注册的服务是通过内置的服务定位器 (RequestServices) 完成的,它带有一个 HttpContext 对象:
let someHttpHandler : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let fooBar =
ctx.RequestServices.GetService(typeof<IFooBar>)
:?> IFooBar
// Do something with `fooBar`...
// Return a Task<HttpContext option>Giraffe 有一个名为 GetService<&#39;T> 的附加 HttpContext 扩展方法,使代码不那么繁琐:
let someHttpHandler : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let fooBar = ctx.GetService<IFooBar>()
// Do something with `fooBar`...
// Return a Task<HttpContext option>还有一些扩展方法可用于检索一些默认依赖项,如 IHostingEnvironment 或 ILogger 对象,这些方法在本文档的相应部分中进行了介绍。
多个环境和配置
ASP.NET Core 内置了对使用多个环境和配置管理的支持,这两者都可以在 Giraffe 中开箱即用。
此外,Giraffe 公开了一个 GetHostingEnvironment() 扩展方法,可用于更轻松地从 HttpHandler 函数中检索 IHostingEnvironment 对象:
let someHttpHandler : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let env = ctx.GetHostingEnvironment()
// Do something with `env`...
// Return a Task<HttpContext option>可以通过 GetService<&#39;T> 扩展方法检索配置选项:
let someHttpHandler : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let settings = ctx.GetService<IOptions<MySettings>>()
// Do something with `settings`...
// Return a Task<HttpContext option>如果在配置服务的时候需要访问配置,可以这样访问:
let configureServices (services : IServiceCollection) =
let serviceProvider = services.BuildServiceProvider()
let settings = serviceProvider.GetService<IConfiguration>()
// Configure services using the `settings`...
services.AddGiraffe() |> ignore记录
ASP.NET Core 有一个内置的日志记录 API,它可以与 Giraffe 开箱即用。
配置日志提供程序
可以在应用程序启动期间配置一个或多个日志记录提供程序:
let configureLogging (builder : ILoggingBuilder) =
// Set a logging filter (optional)
let filter (l : LogLevel) = l.Equals LogLevel.Error
// Configure the logging factory
builder.AddFilter(filter) // Optional filter
.AddConsole() // Set up the Console logger
.AddDebug() // Set up the Debug logger
// Add additional loggers if wanted...
|> ignore
[<EntryPoint>]
let main _ =
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(
fun webHostBuilder ->
webHostBuilder
.Configure(configureApp)
.ConfigureServices(configureServices)
// Calling ConfigureLogging to set up logging providers
.ConfigureLogging(configureLogging)
|> ignore)
.Build()
.Run()
0就像依赖管理一样,日志记录 API 的配置方式与任何其他 ASP.NET Core Web 应用程序的配置方式相同。
从 HttpHandler 函数中记录
配置一个或多个日志提供程序后,您可以通过 GetLogger<&#39;T>() 或 GetLogger (categoryName : string) 扩展方法检索 ILogger 对象(可用于日志记录):
let someHttpHandler : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
// Retrieve an ILogger through one of the extension methods
let loggerA = ctx.GetLogger<ModuleName>()
let loggerB = ctx.GetLogger(&#34;someHttpHandler&#34;)
// Log some data
loggerA.LogCritical(&#34;Something critical&#34;)
loggerB.LogInformation(&#34;Logging some random info&#34;)
// etc.
// Return a Task<HttpContext option>错误处理
Giraffe 公开了一个单独的错误处理中间件,可用于配置功能性错误处理程序,它可以对整个 ASP.NET Core Web 应用程序的任何未处理异常做出反应。
Giraffe ErrorHandler 函数接受一个 Exception 对象和一个默认的 ILogger 并返回一个 HttpHandler 函数:
type ErrorHandler = exn -> ILogger -> HttpHandler因为 Giraffe ErrorHandler 返回一个 HttpHandler 函数,所以可以创建从简单的错误处理函数到复杂的错误处理应用程序的任何东西。
简单的 ErrorHandler 示例
这个简单的 errorHandler 函数将整个异常对象写入日志,清除响应对象并返回 HTTP 500 服务器错误响应:
let errorHandler (ex : Exception) (logger : ILogger) =
logger.LogError(EventId(), ex, &#34;An unhandled exception has occurred while executing the request.&#34;)
clearResponse
>=> ServerErrors.INTERNAL_ERROR ex.Message注册 Giraffe ErrorHandler 中间件
为了启用错误处理程序,您必须在应用程序启动时配置 GiraffeErrorHandlerMiddleware:
// Define the error handler function
let errorHandler (ex : Exception) (logger : ILogger) =
logger.LogError(EventId(), ex, &#34;An unhandled exception has occurred while executing the request.&#34;)
clearResponse
>=> ServerErrors.INTERNAL_ERROR ex.Message
// Register all ASP.NET Core middleware
let configureApp (app : IApplicationBuilder) =
// Register the error handler first, so that all exceptions from other middleware can bubble up and be caught by the ErrorHandler function:
app.UseGiraffeErrorHandler(errorHandler)
.UseGiraffe webApp
[<EntryPoint>]
let main _ =
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(
fun webHostBuilder ->
webHostBuilder
// Calling Configure to set up all middleware
.Configure(configureApp)
.ConfigureServices(configureServices)
.ConfigureLogging(configureLogging)
|> ignore)
.Build()
.Run()
0...或使用 Startup 类的等效项:
type Startup() =
member __.ConfigureServices (services : IServiceCollection) =
// Register default Giraffe dependencies
services.AddGiraffe() |> ignore
member __.Configure (app : IApplicationBuilder)
(env : IHostingEnvironment)
(loggerFactory : ILoggerFactory) =
app.UseGiraffeErrorHandler errorHandler
.UseGiraffe webApp
[<EntryPoint>]
let main _ =
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(
fun webHostBuilder ->
webHostBuilder
.UseStartup<Startup>()
|> ignore)
.Build()
.Run()
0建议将错误处理程序设置为 ASP.NET Core 管道中的第一个中间件,以便错误处理函数可以捕获并处理来自其他中间件的任何未处理异常。 |
|