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                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="FSharp.Control.Websockets" Version="0.3.0" />                
对于支持 PackageReference 的项目,请将此 XML 节点复制到项目文件中以引用此软件包。
paket add FSharp.Control.Websockets --version 0.3.0                
#r "nuget: FSharp.Control.Websockets, 0.3.0"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。请将此复制到交互式工具或脚本的源代码中,以引用此软件包。
// 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时遇到的最大障碍。你必须不断地从消息中读取,直到它结束。人们要么不这样做,最终得到带有小型缓冲区的损坏消息,要么有巨大的缓冲区,这可能会使较小消息成为内存消耗者。

内存使用

使用RecyclableMemoryStreamManagerArrayPool来帮助降低内存使用量和GC。


构建

GitHub Actions
GitHub Actions
Build History

Nuget

名称 稳定 预发布
FSharp.Control.Websockets NuGet Badge NuGet Badge
FSharp.Control.Websockets.TPL NuGet Badge NuGet Badge

使用

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

构建

确保以下要求已安装在您的系统中

> 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 OAuth令牌

    • 然后您可以将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 已计算。
兼容的目标框架
包含的目标框架(在包中)
有关目标框架.NET Standard的更多信息。

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