2014-03-28 59 views
7

我認爲這將是快速的答案,但在今天我找不到正確的答案。我試圖創建F#SignalR Self-Host應用程序(我遵循本教程http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-self-hostF中的SignalR和SelfHost#

結果是我的應用程序不在我的本地主機上映射信號器/集線器,沒有錯誤消息(僅在JavaScript沒有出錯時才顯示'找到客戶)。

namespace Program 

open Owin 
open Dynamic 
open Microsoft.AspNet.SignalR 
open Microsoft.AspNet.SignalR.Hubs 
open Microsoft.Owin.Hosting 
open Microsoft.Owin.Cors 
open System 
open System.Diagnostics 

type MyHub = 
    inherit Hub 
    member x.Send (name : string) (message : string) = 
     base.Clients.All?addMessage name message 

type MyWebStartUp() = 
    member x.Configuration (app :IAppBuilder) = 
     app.UseCors CorsOptions.AllowAll |> ignore 
     app.MapSignalR() |> ignore 
     () 

module Starter = 

[<EntryPoint>] 
let main argv = 
    let hostUrl = "http://localhost:8085" 
    let disposable = WebApp.Start<MyWebStartUp>(hostUrl) 
    Console.WriteLine("Server running on "+ hostUrl) 
    Console.ReadLine() |> ignore 
    disposable.Dispose() 
    0 // return an integer exit code 

我創建了C#應用程序第一,它不完美,我想我的F#代碼是不正確的,但我無法找到的bug。此處參考的是整個項目:https://github.com/MartinBodocky/SignalRFSharp

回答

6

對於Startaction overload,您不必爲啓動配置創建整個類型。你也應該使用use而不是手動處理。

let startup (a:IAppBuilder) = 
     a.UseCors(CorsOptions.AllowAll) |> ignore 
     a.MapSignalR() |> ignore 
    use app = WebApp.Start(hostUrl, startup) 

但是,這只是爲了讓代碼更好,有一個與集線器代碼一個問題,因爲你帶給只能調用一個方法有一個參數,使用FSharp.Interop.Dynamic(中的NuGet)爲一個強大的DLR ?動態模塊操作員。

open EkonBenefits.FSharp.Dynamic 
type MyHub() = 
    inherit Hub() 
    member this.Send (name : string) (message : string) = 
     this.Clients.All?addMessage(name,message) |> ignore