FSharp.Control.Websockets 0.3.0
dotnet add package FSharp.Control.Websockets --version 0.3.0
NuGet\Install-Package FSharp.Control.Websockets -Version 0.3.0
<PackageReference Include="FSharp.Control.Websockets" Version="0.3.0" />
paket add FSharp.Control.Websockets --version 0.3.0
#r "nuget: FSharp.Control.Websockets, 0.3.0"
// Install FSharp.Control.Websockets as a Cake Addin #addin nuget:?package=FSharp.Control.Websockets&version=0.3.0 // Install FSharp.Control.Websockets as a Cake Tool #tool nuget:?package=FSharp.Control.Websockets&version=0.3.0
FSharp.Control.Websockets
FSharp.Control.WebSockets 在 FSharp 友好的函数中包装了 dotnet websockets,并有一个线程安全的版本。
为什么选择它?
线程安全
Dotnet websockets 允许同时只有一个接收和一个发送。如果有多个线程试图写入 websocket,它将抛出包含消息“对于此 WebSocket 实例已有未完成的 'SendAsync' 调用。ReceiveAsync 和 SendAsync 可以同时被调用,但它们各自最多只能有一个未完成操作同时进行。”的 System.InvalidOperationException
异常。这个包装将 websocket 包装在 FIFO 中,允许多个线程同时写或读。有关更多信息,请参阅 Microsoft 的 Websocket Remarks。
F# 友好的选项和行为
这提供了一个readMessage
类型的函数。这是人们在处理WebSocket时遇到的最大障碍。你必须不断地从消息中读取,直到它结束。人们要么不这样做,最终得到带有小型缓冲区的损坏消息,要么有巨大的缓冲区,这可能会使较小消息成为内存消耗者。
内存使用
使用RecyclableMemoryStreamManager和ArrayPool来帮助降低内存使用量和GC。
构建
GitHub Actions |
---|
Nuget
名称 | 稳定 | 预发布 |
---|---|---|
FSharp.Control.Websockets | ||
FSharp.Control.Websockets.TPL |
使用
open System
open System.Net.WebSockets
open System.Threading.Tasks
open Microsoft.AspNetCore.Builder
open Microsoft.AspNetCore.Hosting
open Microsoft.AspNetCore.Http
open FSharp.Control.Websockets
open Microsoft.Extensions.Configuration
let echoWebSocket (httpContext: HttpContext) (next: unit -> Async<unit>) =
async {
if httpContext.WebSockets.IsWebSocketRequest then
let! websocket =
httpContext.WebSockets.AcceptWebSocketAsync()
|> Async.AwaitTask
// Create a thread-safe WebSocket from an existing websocket
let threadSafeWebSocket =
ThreadSafeWebSocket.createFromWebSocket websocket
while threadSafeWebSocket.State = WebSocketState.Open do
try
let! result =
threadSafeWebSocket
|> ThreadSafeWebSocket.receiveMessageAsUTF8
match result with
| Ok (WebSocket.ReceiveUTF8Result.String text) ->
//Echo it back to the client
do! WebSocket.sendMessageAsUTF8 websocket (text)
| Ok (WebSocket.ReceiveUTF8Result.Closed (status, reason)) -> printfn "Socket closed %A - %s" status reason
| Error (ex) -> printfn "Receiving threw an exception %A" ex.SourceException
with e -> printfn "%A" e
else
do! next ()
}
//Convenience function for making middleware with F# asyncs and funcs
let fuse (middlware: HttpContext -> (unit -> Async<unit>) -> Async<unit>) (app: IApplicationBuilder) =
app.Use
(fun env next ->
middlware env (next.Invoke >> Async.AwaitTask)
|> Async.StartAsTask
:> Task)
let configureEchoServer (appBuilder: IApplicationBuilder) =
appBuilder.UseWebSockets()
|> fuse (echoWebSocket)
|> ignore
let getKestrelServer configureServer uri =
let configBuilder = new ConfigurationBuilder()
let configBuilder = configBuilder.AddInMemoryCollection()
let config = configBuilder.Build()
config.["server.urls"] <- uri
let host =
WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.Configure(fun app -> configureServer app)
.Build()
.Start()
host
[<EntryPoint>]
let main argv =
getKestrelServer configureEchoServer "https://127.0.0.1:3000"
Console.ReadKey() |> ignore
0
构建
确保以下要求已安装在您的系统中
- dotnet SDK 2.0或更高版本
- Mono如果您在Linux或macOS上。
> build.cmd // on windows
$ ./build.sh // on unix
环境变量
CONFIGURATION
将设置dotnet命令的配置。如果未设置,则默认为发布。CONFIGURATION=Debug ./build.sh
将导致类似dotnet build -c Debug
的操作
GITHUB_TOKEN
将被用来上传发布说明和nuget包到github。- 在发布之前,请务必设置此变量
监控测试
WatchTests
目标将使用dotnet-watch来监控您的lib或测试中的更改,并在所有TargetFrameworks
上重新运行您的测试。
./build.sh WatchTests
发布
git add .
git commit -m "Scaffold"
git remote add origin origin https://github.com/user/MyCoolNewLib.git
git push -u origin master
paket config add-token "https://nuget.net.cn" 4003d786-cc37-4004-bfdf-c4f3e8ef9b3a
-
- 然后您可以将
GITHUB_TOKEN
设置为上传发布说明和工件到github - 否则它将回退到用户名/密码
- 然后您可以将
然后更新
RELEASE_NOTES.md
中的新版本、日期和发布说明ReleaseNotesHelper
#### 0.2.0 - 2017-04-20
* FEATURE: Does cool stuff!
* BUGFIX: Fixes that silly oversight
- 然后您可以使用
Release
目标。这将- 提交并升级版本:
将版本升到0.2.0
并将发布说明添加到提交中 - 将包发布到nuget
- 推送git标签
- 提交并升级版本:
./build.sh Release
代码格式化
要格式化代码,请运行以下目标
./build.sh FormatCode
此操作使用Fantomas进行代码格式化。请将该存储库中的代码格式化错误报告。
产品 | 版本 兼容和额外的计算目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET Standard | netstandard2.0 兼容。 netstandard2.1 兼容。 |
.NET Framework | net461 兼容。 net462 已计算。 net463 已计算。 net47 已计算。 net471 已计算。 net472 已计算。 net48 已计算。 net481 已计算。 |
MonoAndroid | monoandroid 已计算。 |
MonoMac | monomac 已计算。 |
MonoTouch | monotouch 已计算。 |
Tizen | tizen40 已计算。 tizen60 已计算。 |
Xamarin.iOS | xamarinios 已计算。 |
Xamarin.Mac | xamarinmac 已计算。 |
Xamarin.TVOS | xamarintvos 已计算。 |
Xamarin.WatchOS | xamarinwatchos 已计算。 |
-
.NETFramework 4.6.1
- FSharp.Core (>= 6.0.0)
- Microsoft.IO.RecyclableMemoryStream (>= 3.0.0)
-
.NETStandard 2.0
- FSharp.Core (>= 6.0.0)
- Microsoft.IO.RecyclableMemoryStream (>= 3.0.0)
-
.NETStandard 2.1
- FSharp.Core (>= 6.0.0)
- Microsoft.IO.RecyclableMemoryStream (>= 3.0.0)
NuGet 包 (2)
显示依赖 FSharp.Control.Websockets 的前 2 个 NuGet 包
包 | 下载 |
---|---|
Saturn
Saturn 是为 F# 实现服务器端、功能 MVC 模式的意见化 Web 开发框架 |
|
StreamDeckDotnet
StreamDeckDotnet 帮助您为自定义 Stream Deck 插件构建事件处理管道! |
GitHub 仓库
此包未用于任何知名 GitHub 仓库。
版本 | 下载 | 最后更新 |
---|---|---|
0.3.0 | 8,797 | 3/4/2024 |
0.3.0-beta001 | 85 | 3/4/2024 |
0.2.3 | 48,493 | 9/18/2022 |
0.2.3-beta001 | 175 | 9/18/2022 |
0.2.2 | 246,650 | 10/2/2019 |
0.2.1 | 1,152 | 9/13/2019 |
0.2.0 | 23,905 | 5/24/2019 |
0.1.2 | 520 | 5/24/2019 |
0.1.1 | 499 | 5/24/2019 |
0.1.0 | 3,674 | 5/24/2019 |
## [0.3.0] - 2024-03-04
[0.3.0]: https://github.com/TheAngryByrd/FSharp.Control.WebSockets/compare/v0.2.3...v0.3.0
### 更改
- [更新 Microsoft.IO.RecyclableStreams 至 v3](https://github.com/TheAngryByrd/FSharp.Control.WebSockets/pull/10) 谢谢 @ntwilson