Swift中使用SwiftR的SignalR-协商请求期间出错

时间:2018-10-05 04:32:09

标签: swift asp.net-core signalr asp.net-core-signalr swiftr

我在Mac上将.netcore与VS社区版一起使用,并希望将SignalR用于使用SwiftR的iOS应用

我直接从这里得到了一个工作项目: https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-2.1&tabs=visual-studio-mac

并在本地运行它,并在Visual Studio中运行-它在localhost:5000旋转,我什至使用示例视图来执行一些SignalR命令。一切看起来都很棒! 它有效!

现在,我正在尝试利用SwiftR,基本上只是对本地运行的SignalR进行简单的调用,以证明它可以在Swift中运行。 (http://localhost:5000/chatHub

我收到错误消息:协商请求期间出错

输出是这样的:

started
Error: Optional(["message": Error during negotiation request.])
disconnected

这是我的代码-有什么想法吗?我使用的是Microsoft提供的确切代码(似乎运行正常),但是Swift不喜欢它。

在我的Podfile中,我只是在使用

pod 'SwiftR'

并在其他viewController中对其进行测试,我正在这样做:

func testThis()
    {
        // Client
        let connection = SignalR("http://localhost:5000/chatHub")

        let simpleHub = Hub("ChatHub")
        simpleHub.on("SendMessage") { args in
            let message = args![0] as! String
            let detail = args![1] as! String
            print("Message: \(message)\nDetail: \(detail)")
        }

        connection.addHub(simpleHub)
        connection.starting = { print("started") }
        connection.connected = { print("connected: \(connection.connectionID)") }
        connection.connectionSlow = { print("connectionSlow") }
        connection.reconnecting = { print("reconnecting") }
        connection.reconnected = { print("reconnected") }
        connection.disconnected = { print("disconnected") }
        connection.error = { error in
            print("Error: \(error)")

            if let source = error?["source"] as? String, source == "TimeoutException" {
                print("Connection timed out. Restarting...")
                connection.start()
            }
        }
        connection.start()

        do {
            try
            // Invoke server method
            simpleHub.invoke("SendMessage", arguments: ["Simple Test", "This is a simple message"])
        }
        catch {
            print(error)
        }
        // Invoke server method and handle response
          do {
            try simpleHub.invoke("SendMessage", arguments: ["Simple Test", "This is a simple message"]) { (result, error) in
            if let e = error {
                print("Error: \(e)")
            } else {
                print("Success!")
                if let r = result {
                    print("Result: \(r)")
                }
            }
        }
        }
          catch {
            print(error)
        }
    }

在viewDidLoad()中,我只是在调用testThis()

我什至修改了.net代码以允许这样的cors:

services.AddCors();

然后再向下

 app.UseCors(cors =>
            {
                cors.AllowAnyHeader();
                cors.AllowAnyOrigin();
                cors.AllowAnyMethod();
            });

但它仍然在说

Error: Optional(["message": Error during negotiation request.])

真的很感谢任何人都能提供的见解!

2 个答案:

答案 0 :(得分:1)

SwiftR不支持ASP.NET Core SignalR,您可以尝试使用https://github.com/moozzyk/SignalR-Client-Swift。尽管这里没有专门讨论iOS客户端,但ASP.NET SignalR和ASP.NET Core SignalR是不同的产品https://docs.microsoft.com/en-us/aspnet/core/signalr/version-differences?view=aspnetcore-2.1

答案 1 :(得分:0)

我遇到了同样的问题。以我为例,我在IIS上托管了一个 SignalR Core应用程序,试图通过SwiftR和Moozzyk的客户端访问它。事实证明,我的主机上未启用WebSocket,这很麻烦,因为所引用的客户端仅使用WebSocket(没有回退到其他传输方法,例如服务器发送事件,长轮询等)。

在IIS上启用WebSockets为我解决了这个问题。以下是有关操作方法的链接: https://docs.microsoft.com/en-us/iis/configuration/system.webserver/websocket