конечные точки websharper F# — захват всех обработчиков страниц и перенаправление страниц

извините, это такой длинный пост

Я использую F# и WebSharper (я новичок в обеих технологиях)

У меня определены некоторые конечные точки (у меня есть рабочий код, пока я не добавлю конечную точку NotFound)

type EndPoint =
    | [<EndPoint "/">] Home
    | [<EndPoint "/login">] Login
    | [<EndPoint "/about">] About
    | [<EndPoint "/logout">] Logout

    // trying to make a catch-all page handler
    | [<EndPoint "/"; Wildcard>] NotFound of string 
...
let HomePage ctx =
    Templating.Main ctx EndPoint.Home "Home" [
        // page stuff
    ]

let LoginPage ctx =
    Templating.Main ctx EndPoint.Login "Login" [
        h1 [] [text "Login Here"]
        div [] [client <@ Client.LoginWidget() @>]
    ]

// other page constructs
let MissingPage ctx path =
    Templating.Main ctx EndPoint.About "Page Not Found" [
        h1 [] [text "404"]
        p [] [text "The requested page could not be found"]
        p [] [text path]
    ]
...
[<Website>]
let Main =
    Application.MultiPage (fun ctx endpoint ->
        match endpoint with
        | EndPoint.Home -> HomePage ctx
        | EndPoint.About -> AboutPage ctx
        | EndPoint.Login -> LoginPage ctx
        | EndPoint.Logout -> 
            async {
                // call server-side code to log the user out
                // what would i do here to redirect the user to the /login 
                // page
            }
        | EndPoint.NotFound path -> MissingPage ctx path
    )

Добавление конечной точки NotFound приводит к беспорядку на других моих страницах, например, моя домашняя страница начинает обрабатываться обработчиком MissingPage. что я могу понять, поскольку домашняя страница настроена на соответствие «/», а шаблон not соответствует подстановочному знаку «/», хотя я ожидал, что одиночный / будет соответствовать конечной точке Home и чему-либо еще, кроме /Login /About и /Выйдите из системы, чтобы соответствовать ветке NotFound. Но явно, я что-то не правильно понимаю.

Итак, как я могу получить конечную точку типа «универсальный», чтобы я мог правильно обрабатывать любой путь, который явно не обслуживается

другая вещь, которая портится, когда у меня был код обработки NotFound, - это то, что обработчик входа больше не обрабатывает

div [] [client <@ Client.LoginWidget() @>]

И, наконец, в обработчике выхода я хочу вызвать какой-то серверный код (нет проблем), но что мне делать, чтобы затем перенаправить на новую веб-страницу, например, чтобы отправить пользователя обратно на страницу /login?

Еще раз извините за такой длинный пост, Дерек.


person Derek Lavine    schedule 11.05.2018    source источник


Ответы (1)


Ниже основано на том, что передал мне Лоик из websharper.com, добавив здесь на случай, если это будет полезно кому-то еще.

Нужен первый Web.config

<httpErrors errorMode="Custom">
  <remove statusCode="404"/>
  <error statusCode="404" responseMode="ExecuteURL" path="/notfound"/>
</httpErrors>

type EndPoint = 
... other end points
| [<EndPoint "/notfound"; Wildcard>] NotFound of string


[<Website>]
let Main =
    Application.MultiPage (fun ctx endpoint ->
        match endpoint with
        // handle other endpoints
        // Handle none existant paths
        | EndPoint.NotFound _ ->
            // Parse the original URI from ASP.NET's rewrite, in case you need it
            let requestedUri =
                let q = ctx.RequestUri.Query
                let q = q.[q.IndexOf(';') + 1 ..]
                match System.Uri.TryCreate(q, System.UriKind.Absolute) with
                // The request was to /notfound/... directly
                | false, _ -> ctx.RequestUri
                // The request was to a non-existent path, and rewritten by ASP.NET
                | true, uri -> uri

          Content.Text (sprintf "Unknown URI: %A" requestedUri)
          |> Content.SetStatus Http.Status.NotFound

...
person Derek Lavine    schedule 14.05.2018