- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用 C# 编写的现有 owin 应用程序,并希望将一个 suave 应用程序作为中间件安装,但由于我对 F# 比较陌生,我发现很难导航应该如何完成。我想我正在寻找类似的东西:
// in F# land
module MySuaveApp.ApiModule
let app =
choose
[ GET >=> choose
[ path "/hello" >=> OK "Hello GET"
path "/goodbye" >=> OK "Good bye GET" ]
POST >=> choose
[ path "/hello" >=> OK "Hello POST"
path "/goodbye" >=> OK "Good bye POST" ] ]
let getSuaveAsMiddleware() =
... magic goes here ...
// in Startup.cs
app.Use(MySuaveApp.ApiModule.getSuaveAsMiddleware())
OwinApp.ofAppFunc
的组合。或
OwinApp.ofMidFunc
,但我一生都无法弄清楚它应该是什么。
最佳答案
没有简单的魔法。1 ofAppFunc
和 ofMidFunc
在这里创建WebPart
s 没有 OWIN 组件,即 OWIN -> Suave,而您想要 Suave -> OWIN。
以下适用于您的“应用程序”,并作为一个示例,需要什么才能使其工作:
open System.Runtime.CompilerServices
[<Extension>]
module Api =
open Suave
open Successful
open Filters
open Operators
open Microsoft.Owin
open System.Threading.Tasks
let app =
choose [ GET >=> choose [ path "/hello" >=> OK "Hello GET"
path "/goodbye" >=> OK "Good bye GET" ]
POST >=> choose [ path "/hello" >=> OK "Hello POST"
path "/goodbye" >=> OK "Good bye POST" ] ]
let withCtx (ctx : IOwinContext) webpart =
async {
let request =
{ HttpRequest.empty with
headers = ctx.Request.Headers |> List.ofSeq |> List.map (fun kvp -> kvp.Key, kvp.Value |> String.concat ",")
host = ctx.Request.Host.Value
``method`` = HttpMethod.parse ctx.Request.Method
url = ctx.Request.Uri }
let! res = webpart { HttpContext.empty with request = request }
res |> Option.iter (fun r ->
ctx.Response.StatusCode <- r.response.status.code
match r.response.content with
| Bytes bs -> ctx.Response.Write bs
| _ -> failwith "Not supported")
return res
}
type SuaveMiddleware(n) =
inherit OwinMiddleware(n)
override __.Invoke(context : IOwinContext) =
let res = withCtx context app |> Async.RunSynchronously
match res with
| Some _ -> Task.CompletedTask
| None -> base.Next.Invoke context
[<Extension>]
let UseSuave(app : Owin.IAppBuilder) =
app.Use(typeof<SuaveMiddleware>)
withCtx
尝试满足给定
IOwinContext
的请求和
WebPart
.它主要通过在 Suave 和 OWIN 上下文和相关实体之间来回转换来实现。
SuaveMiddleware
如果 Suave 无法满足请求,则将请求转发到下一个中间件。
using MySuave;
using Owin;
namespace Main
{
using System.Web.Http;
public class Startup
{
public static void Configuration(IAppBuilder appBuilder)
{
appBuilder.UseSuave();
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
appBuilder.UseWebApi(config);
}
}
}
namespace Main.Example
{
using System.Web.Http;
[RoutePrefix("api")]
public class ExampleController : ApiController
{
[HttpGet, Route("")]
public string Index()
{
return "Hello World";
}
}
}
http://localhost:9000/hello
Hello GET
http://localhost:9000/api
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hello World</string>
关于f# - 在 Owin 应用程序中安装 Suave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38937188/
我一直在研究在 Suave 网络服务器上使用 websockets。不幸的是,它没有很好的记录,我设法找到的是:https://github.com/SuaveIO/suave/tree/master
所以我的服务器设置非常简单。如果路径的格式为 /article/something,它应该提供文件夹 static 中的静态文件 something.html。出于某种原因,Files.file We
我正在 http://vgaltes.com/suave/forms-with-suave-experimental-and-suave-forms 扩展教程/支持 HTML 选择输入/下拉列表。 d
我尝试重定向到路径为“/hello”的 index.html 页面 >>= redirect “index.html”,但它一直显示错误 No data received ERR_EMPTY_RESP
我最近开始使用 Suave;我使用 yeoman 和 F# 生成器设置了一个项目。为了运行该应用程序,我使用 Fake 构建了一个可执行文件,然后运行它。每当我更改任何应用程序文件(即 *.fs 文件
我正在处理 Suave 1.0 + Angular 2.0 sample app在监视模式下启动Suave服务器非常有趣,因此服务器监视根文件夹和子文件夹中的文件(js,css,html)并自动发送r
我有一个处理 OAuth 回调请求的 Web 部件。 从 API 获取访问 token 和用户 ID 后,我想将其存储在 session 状态中。但是在后续请求中读取 session 时,我只看到“S
我正在使用 Suave 构建一个经过身份验证的 Web API,我经常偶然发现在不同功能中聚合信息的问题 pathScan Navigation.playersAvailables GetGame >
我想在 Suave 中使用非拉丁符号,例如,西里尔文,但得到奇怪的结果 MCVE open Suave open Suave.Filters open Suave.Operators open Sua
我最近开始使用 F# 和 Suave 为我大学的一个项目创建一个网站。我需要做的一件事是让用户通过网站上传文件,然后我将解析该文件。 我现在拥有的是 let post = let ``proce
我们是一家初创公司,目前正处于将 SUAVE 与 F# 用作 Web 应用程序开发框架的评估模式。我非常热衷于使用 SUAVE 框架来开发我的应用程序。 我只想知道 SUAVE 是否已做好生产准备,与
我有一个用 C# 编写的现有 owin 应用程序,并希望将一个 suave 应用程序作为中间件安装,但由于我对 F# 比较陌生,我发现很难导航应该如何完成。我想我正在寻找类似的东西: // in F#
我想了解如何控制“缓存”响应与“重新计算”响应的时间。 举个例子: [] let main [| port |] = let config = { defaultConfig
我想创建一个 WebPart将所有请求转发到我指定的另一个 Web 服务器。 用法可能如下所示: let app = choose [ path "/" >=> OK "Hel
我有一个用于移动设备的嵌入式服务器,有时可能会崩溃。我需要始终让服务器保持事件状态。现在的问题是我看不到异步时如何重启服务器: let startServer(rootPath) = let
Suave.Json.mapJson将输入 JSON 映射到一个对象到您的函数中,然后将您的函数的输出映射到 JSON。 问题是我对它映射到我的函数的方式感到满意,但我需要返回一个 json 字符串响
有没有人有如何让 SignalR 在 Suave 中工作的例子? 我创建了一个 demo project显示了一个正常工作的 Suave 服务器和一个工作中的集线器代理生成,以及一个演示页面。该页面显
我刚刚开始使用 Suave.io。我敢肯定,随着我对 Applicatives 的深入研究,这一点会变得更加清晰——但从高层次来看,我不知道如何编写 pathScan适用于 request 的规则也适
我正在学习 suave 教程,并且正在努力将 JSON 返回到前端。我目前有代码。 (我没有使用 Chiron 包)。我可以很好地启动 Web 服务器,但是当我转到 localhost:8083/he
在suave.io中,有一个函数mapJson : let mapJson (f: 'a -> 'b) = request(fun r -> f (fromJson r.rawForm)
我是一名优秀的程序员,十分优秀!