public static void StartServer(IDistributedApp app, string url, int expectedClients = 0, Action <Exception> connected = null) { Task.Run(() => { using (var context = NetMQContext.Create()) using (var input = context.CreateDealerSocket()) { Dictionary <string, DealerSocket> clients = null; try { input.Bind(url); if (expectedClients > 0) { clients = new Dictionary <string, DealerSocket>(); awaitClients(input, expectedClients, clients, context, app); app.SendToClient = (client, msg) => writeMessage(clients[client], msg); } connected(null); } catch (Exception ex) { connected(ex); return; } //loop var message = new NetMQMessage(expectedFrameCount: 7); var appMessage = new DistributedAppMessage(); for (;;) { message = input.ReceiveMultipartMessage(expectedFrameCount: 7); try { if (!readMessage(message, appMessage)) { continue; } app.Receive(appMessage); } catch { //td: log? } finally { message.Clear(); } } } }); }
public async override Task Invoke(IOwinContext context) { if (context.Request.Method == "POST") { var id = Guid.Empty; var method = default(string); var function = default(FunctionAction); if (TryParseObjectMethod(context.Request.Path.Value, out id, out method) || TryParseFunctional(context.Request.Path.Value, out function)) { var requestBody = context.Request.Body; var response = context.Response; var body = new StreamReader(requestBody); var data = await body.ReadToEndAsync(); var completion = new TaskCompletionSource <bool>(); try { if (function != null) { function(data, context.Request, context.Response, completion); } else //a distributed app message { _server.Receive(new DistributedAppMessage { Id = id, Method = method, Data = data, Success = responseData => SendResponse(response, responseData, completion), Failure = ex => SendError(response, ex, completion), }); } await completion.Task; } catch (Exception ex) { SendError(response, ex, null); } return; } } await Next.Invoke(context); }
public async override Task Invoke(IOwinContext context) { if (context.Request.Method == "POST") { Guid id; string method; if (TryParsePath(context.Request.Path.Value, out id, out method)) { var requestBody = context.Request.Body; var response = context.Response; try { var body = new StreamReader(requestBody); var data = await body.ReadToEndAsync(); var completion = new TaskCompletionSource <bool>(); _server.Receive(new DistributedAppMessage { Id = id, Method = method, Data = data, Success = responseData => SendResponse(response, responseData, completion), Failure = ex => SendError(response, ex, completion), }); await completion.Task; } catch (Exception ex) { SendError(response, ex, null); } return; } } await Next.Invoke(context); }