ich vor kurzem in ein Problem lief mit dem Versuch, zu einem offenen WebSocket mit der SendAsync Methode auszustrahlen, eine InvalidOperationException mit der Meldung „Ein Sendevorgang läuft bereits“ Empfangein „Besetzt“ WebSocket Erkennen
die Graben durch Quellcode für die WebSocket-Klasse, ein Belegtzustand wird intern verfolgt:
internal ChannelState _sendState;
// Represents the state of a single channel; send and receive have their own states
internal enum ChannelState {
Ready, // this channel is available for transmitting new frames
Busy, // the channel is already busy transmitting frames
Closed // this channel has been closed
}
Idealfall, wenn ich über ein Update auf eine WebSocket-Verbindung zu übertragen, ich möchte im voraus wissen, dass es voll ist und Führen Sie eine andere Behandlung durch (z. B. die Nachricht in die Warteschlange stellen).
Es scheint seltsam, dass dieser Zustand als internes markiert ist - war es ein öffentliches Eigentum ich einfach für
context.WebSocket.SendState == ChannelState.Ready
Was das richtige Muster auf einem WebSocket zu SendAsync ist überprüfen könnte, die diese Ausnahme zu werfen verhindern?
Ich hasse es, den Zugang zu dieser Eigenschaft durch Reflexion zu hacken.
bearbeiten zu klären:
Die WebSocket.State Eigenschaft diese Situation nicht helfen. Die Eigenschaft verwendet diese Aufzählung:
public enum WebSocketState
{
None,
Connecting,
Open,
CloseSent,
CloseReceived,
Closed,
Aborted
}
Sobald der Socket-Verbindung geöffnet wurde, wertet diese Aussage auf „true“, unabhängig davon, ob es besetzt zu senden:
context.WebSocket.State == WebSocketState.Open
Verwenden Sie einen 'AspNetWebSocket'? Wenn ja, hat es eine "State" -Eigenschaft, die Sie überprüfen können. https://msdn.microsoft.com/en-us/library/system.web.websockets.aspnetwebsocket.state(v=vs.110).aspx – dharms
Leider ändert sich die State-Eigenschaft nicht, wenn der Socket "beschäftigt" ist - Es bleibt "offen". Wenn Sie versuchen, während der Besetztphase ein "SendAsync" zu initiieren, wird eine Ausnahme ausgelöst. –
Ändern Sie möglicherweise Ihren Code so, dass nur ein Thread die Sendevorgänge ausführt. Dieser Prozess kann gegen eine Warteschlange funktionieren, die von Ihrer Anwendung ausgefüllt wird, wenn sie eine Nachricht senden möchte. – dharms