コード例 #1
0
        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();
                            }
                        }
                    }
            });
        }
コード例 #2
0
ファイル: ExcessMiddleware.cs プロジェクト: SailerDom/Excess
        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);
        }
コード例 #3
0
ファイル: Owin.cs プロジェクト: afrog33k/Excess
        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);
        }