我在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.])
真的很感谢任何人都能提供的见解!
答案 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