我正在设置一个简单的Giraffe应用,该应用具有一个或两个端点和一个SignalR集线器。我拥有的是这样的:
type JsonBlob = JsonProvider<"Blob.json">
type Message =
| GetBlobs of AsyncReplyChannel<JsonBlob.Root list>
| PostBlob of JsonBlob.Root
type JsonBlobHub(agent : MailboxProcessor<Message>) =
inherit Hub()
member self.RespondToClient() =
let blobs = agent.PostAndReply(GetBlobs)
self.Clients.All.SendAsync("ReceiveBlobList", blobs)
let agentFactory(serviceProvider : IServiceProvider) =
let thing = serviceProvider.GetService<Thing>()
MailboxProcessor.Start(fun (inbox : MailboxProcessor<Message>) ->
/* loop implementation */
)
// other stuff
let configureApp (app : IApplicationBuilder) =
app.UseSignalR(fun routes -> routes.MapHub<JsonBlobHub>(PathString "/blobhub")) |> ignore
app.UseGiraffe webApp // webApp defined elsewhere, not important
let configureServices (services : IServiceCollection) =
services.AddSingleton<MailboxProcessor<Message>>(agentFactory) |> ignore
services.AddGiraffe() |> ignore
services.AddSignalR() |> ignore
let main argv =
WebHostBuilder() =
.UseKestrel()
.UseWebRoot("WebRoot")
.Configure(Action<IApplicationBuilder> configureApp)
.ConfigureServices(configureServices)
.ConfigureLogging(configureLogging)
.Build()
.Run
0
当SignalR客户端连接到/blobhub
时,由于应用程序在尝试激活MailboxProcessor<Message>
类时无法解析BlobHub
,因此连接意外关闭。
但是,我有些困惑,因为我已经在MailboxProcessor<Message>
函数的容器中清楚地注册了configureServices
类型。有人在这段代码中看到问题吗?或者也许我以为这些事情应该起作用,并且出于某些原因我不应该知道它们不应该?
答案 0 :(得分:2)
好吧...。事实证明,我做了一件愚蠢的事情,偶然地有两个Message
的定义。我的JsonBlobHub
使用一个定义,而agentFactory
和configureServices
使用另一个定义。一旦删除了Message
的定义之一,DI容器就可以按照您的期望解决JsonBlobHub
的激活。
我想说这很浪费时间,但实际上确实带来了一个很好的小实例,它包含了一起使用F#,Giraffe,ASP.NET Core和SignalR,并演示了所有这些内容一起玩。