Unable to reconnect SignalR JS client after recycle of application pool - asp.net-web-api

When i recycle my Application Pool for the site where the SignalR hub is running, the javascript clients is unable to reconnect. But everything is OK if the client do a refresh on his browser.
In the clients console log, these lines repeat multiple times every second after a reset of the app pool: ( i have replaced the connection token with abcd )
LOGG: [15:51:19 UTC+0200] SignalR: Raising the reconnect event
LOGG: [15:51:19 UTC+0200] SignalR: An error occurred using longPolling. Status = parsererror. undefined
LOGG: [15:51:19 UTC+0200] SignalR: SignalR: Initializing long polling connection with server.
LOGG: [15:51:19 UTC+0200] SignalR: Attempting to connect to 'http://lab/signalr/reconnect?transport=longPolling&connectionToken=abcd' using longPolling.
LOGG: [15:51:19 UTC+0200] SignalR: Raising the reconnect event
I have tried disabling all authentication on the hub, but still the same result.
Both the server and client is running on SignalR v1.0.1
The hubconnection on the client is set up like this:
var connection = $.hubConnection('http://lab:8097', { logging: true });
var proxy = connection.createHubProxy('task');
connection.start({ jsonp: true }).done(function () {
proxy.invoke('OpenTask', id);
});
Im also using crossdomain on the server side hub registration:
RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
The server is running on IIS 7.5, and the client is IE9.
Anyone have an idea what's wrong?

This issue will be resolved in 1.1 RTW (not released yet, currently only the beta is out).
For your reference here's the fix: https://github.com/SignalR/SignalR/issues/1809. If you'd like to have the fix earlier you can implement the changes noted in the issue.
Lastly, if you do choose to implement the fix you will need to handle the .disconnected event on the connection and restart the connection entirely.

Related

How to deploy and interact with a rust websocket?

I'm a beginner in Rust and WebSockets and I'm trying to deploy on Heroku a little chat backend I wrote (everything works on localhost). The build went well and I can see the app is running, and I'm now trying to connect to the WebSocket from a local HTML/Javascript frontend, but it is not working.
Here is my code creating the WebSocket on my rust server on Heroku (using the tungstenite WebSocket crate):
async fn main() -> Result<(), IoError> {
let port = env::var("PORT").unwrap_or_else(|_| "8080".to_string());
let addr = format!("0.0.0.0:{}", port);
// Create the event loop and TCP listener we'll accept connections on.
let try_socket = TcpListener::bind(&addr).await;
let listener = try_socket.expect("Failed to bind");
println!("Listening on: {}", addr);
and here is the code in my Javascript file that tries to connect to that WebSocket:
var ws = new WebSocket("wss://https://myappname.herokuapp.com/");
My web client gets the following error in the console:
WebSocket connection to 'wss://https//rocky-wave-51234.herokuapp.com/' failed
I searched to find the answer to my issue but unfortunately didn't find a fix so far. I've found hints that I might have to create an HTTP server first in my backend and then upgrade it to a WebSocket, but I can't find a resource on how to do that and don't even know if this is in fact the answer to my problem. Help would be greatly appreciated, thanks!
I think your mistake is the URL you use:
"wss://https://myappname.herokuapp.com/"
A URL usually starts with <protocol>://. The relevant protocols here are:
http - unencrypted hypertext
https - encrypted hypertext
ws - unencrypted websocket
wss - encrypted websocket
So if your URL is an encrypted websocket, it should start only with wss://, a connection cannot have multiple protocols at once:
"wss://myappname.herokuapp.com/"

FastAPI: WebSocket connection close after ~40s

I try to ping/pong json packages between a FastAPI websocket endpoint and a client using the websocket library from Zephyr RTOS. Unfortunately the connection is closed by the FastAPI server after ~40 seconds. This time seems to be constant. My guess is, that there must occur a timeout event due to a missing/wrong condition.
This post seems to address my issue. Unfortunately my code is not running with a newer uvicorn version which would support --ws-ping-interval or --ws-ping-timeout.
For a simple test I did the following:
Server side:
#app.websocket("/ws/update_status")
async def websocket_endpoint(websocket: WebSocket, db: Session = Depends(get_db)):
await websocket.accept()
while True:
data = await websocket.receive_json()
await websocket.send_json('{"status":"ok"}')
Client side (C code running on Zephyr-RTOS):
// some code to define JSON package
while(1)
{
websocket_send_msg(sock, send_buffer, json_length, WEBSOCKET_OPCODE_DATA_TEXT, true, true, SYS_FOREVER_MS);
websocket_recv_msg(sock, receive_buffer, sizeof(receive_buffer), &message_type, 0, SYS_FOREVER_MS);
}
I use the following package versions:
uvicorn=='0.13.4'
fastapi=='0.68.2'
Does anyone know why the connection aborts after 40 seconds and how it can be avoided?

Why is this websocket connection being refused?

I try to use the slack-sample bot from this blogpost https://www.opsdash.com/blog/slack-bot-in-golang.html . I've successfully created my api token, but i can not connect to the websocket server (the rtm.start request passs normally). I've get the error message
dial tcp 54.242.95.213:443: connectex: No connection could be made because the target machine actively refused it
I've also tried to connect via a chrome app called Simple Web Socket Client and via a website based one tester. Both work well, i can establish a connection and i can send data.
I'm behind a proxy, but i only have troubles with golang's websocket.Dial function.
Does anybody know why this can happen?
I use:
- Windows 7 SP1 x64
- Golang 1.7.1 windows/amd64
Greetings
Tonka
If you are using gorilla/websocket, it has the ability to use a Proxy. From issue 107:
import "net/http"
...
var dialer = websocket.Dialer{
Proxy: http.ProxyFromEnvironment,
}
If you are using golang.org/x/net you should switch to gorilla/websocket.

Unity TCP socket connection not working on Mac OS X

I'm trying to publish my Unity multiplayer game to Mac App Store, but by some reason in production the socket fails to connect to server, throwing the following exception:
"Access denied System.Net.Sockets.Socket.Bind".
I have "com.apple.security.network.client" and "com.apple.security.app-sandbox" entitlement, but it does not work. HTTP requests work OK though.
If I test the app in debug build - it works..what could be blocking it ? The port I'm using is 16005
This is the client connection code:
var tcpClient = new TcpClient();
tcpClient.Connect(Host, Port);
networkStream = tcpClient.GetStream();
listenThread = new Thread(ListenToServer);
listenThread.Start();
Any ideas ?
I Solved the problem.
It turns out I had to add the server entitlement too.
(Although I'm not starting any server nor listening for incoming connections).
So adding "com.apple.security.network.server" entitlement solved the problem

force client disconnect from server with socket.io and nodejs

Is there any way to disconnect a client with SocketIO, and literally close the connection? So if someone is connected to my server, and I want to close the connection between them and my server, how would I go about doing that?
Edit: This is now possible
You can now simply call socket.disconnect() on the server side.
My original answer:
This is not possible yet.
If you need it as well, vote/comment on this issue.
socket.disconnect() can be used only on the client side, not on the server side.
Client.emit('disconnect') triggers the disconnection event on the server, but does not effectively disconnect the client. The client is not aware of the disconnection.
So the question remain : how to force a client to disconnect from server side ?
Any reason why you can't have the server emit a message to the client that makes it call the disconnect function?
On client:
socket.emit('forceDisconnect');
On Server:
socket.on('forceDisconnect', function(){
socket.disconnect();
});
Checking this morning it appears it is now:
socket.close()
https://socket.io/docs/client-api/#socket-close
For those who found this on google - there is a solution for this right now:
Socket.disconnect() kicks the client (server-side). No chance for the client to stay connected :)
Assuming your socket's named socket, use:
socket.disconnect()
This didn't work for me:
`socket.disconnect()`
This did work for me:
socket.disconnect(true)
Handing over true will close the underlaying connection to the client and not just the namespace the client is connected to Socket IO Documentation.
An example use case: Client did connect to web socket server with invalid access token (access token handed over to web socket server with connection params). Web socket server notifies the client that it is going to close the connection, because of his invalid access token:
// (1) the server code emits
socket.emit('invalidAccessToken', function(data) {
console.log(data); // (4) server receives 'invalidAccessTokenEmitReceived' from client
socket.disconnect(true); // (5) force disconnect client
});
// (2) the client code listens to event
// client.on('invalidAccessToken', (name, fn) => {
// // (3) the client ack emits to server
// fn('invalidAccessTokenEmitReceived');
// });
In my case I wanted to tear down the underlying connection in which case I had to call socket.disconnect(true) as you can see is needed from the source here
client._onDisconnect() should work
I'm using client.emit('disconnect') + client.removeAllListeners() for connected client for ignore all events after disconnect
Socket.io uses the EventEmitter pattern to disconnect/connect/check heartbeats so you could do. Client.emit('disconnect');
I am using on the client side socket.disconnect();
client.emit('disconnect') didnt work for me
You can do socket = undefined in erase which socket you have connected. So when want to connected do socket(url)
So it will look like this
const socketClient = require('socket.io-client');
let socket;
// Connect to server
socket = socketClient(url)
// When want to disconnect
socket = undefined;
I have using the socket client on React Native app, when I called socketIOClient.disconnect() this disconnects from the server but when I connect to the socket again the previous events were connected again, and the below code works for me by removing all existing events and disconnecting socket conneciton.
socketIOClient.removeAllListeners();
socketIOClient.disconnect(true);
To disconnect socket forcefully from server side
socket.disconnect(true)
OR
To disconnect socket by client side event
On client:
socket.emit('forceDisconnect');
On Server:
socket.on('forceDisconnect', function(){
socket.disconnect(true);
});
You can call socket.disconnect() on both the client and server.
Add new socket connections to an array and then when you want to close all - loop through them and disconnect. (server side)
var socketlist = [];
io.sockets.on('connection', function (socket) {
socketlist.push(socket);
//...other code for connection here..
});
//close remote sockets
socketlist.forEach(function(socket) {
socket.disconnect();
});
use :
socket.Disconnect() //ok
do not use :
socket.disconnect()

Resources