public async Task Send(Message message) { IServiceCallback callback = OperationContext.Current.GetCallbackChannel <IServiceCallback>(); IChannel channel = (IChannel)callback; WcfClientContext context; if (!callbacks.TryGetValue(channel, out context)) { context = new WcfClientContext(callback); callbacks[channel] = context; context.Closed += delegate() { callbacks.TryRemove(channel, out context); }; ClientForm clientForm = new ClientForm(context); clientForm.Show(); } byte[] body = new byte[] { }; if (!message.IsEmpty) { body = message.GetBody <byte[]>(); } WebSocketMessageProperty property = (WebSocketMessageProperty)message.Properties[webSocketMessageProperty]; await context.Receive(body, body.Length, property == null? WebSocketMessageType.Binary : property.MessageType, true); }
private HttpListener CreateHttpListener(Uri uri) { HttpListener listener = new HttpListener(); string scheme = GetHttpScheme(uri); UriBuilder newUri = new UriBuilder(uri) { Scheme = scheme }; listener.Prefixes.Add(newUri.ToString()); listener.Start(); Task task = new Task(delegate { while (true) { HttpListenerContext listenerContext; try { listenerContext = listener.GetContext(); } catch { break; } if (listenerContext.Request.IsWebSocketRequest) { Invoke(new MethodInvoker(delegate { HttpListenerClientContext clientContext = new HttpListenerClientContext(listenerContext); ClientForm clientForm = new ClientForm(clientContext); clientForm.Show(); })); } else { listenerContext.Response.StatusCode = 400; listenerContext.Response.Close(); } } }); task.Start(); return(listener); }