public void OnReceivedRequest(INodeEndpointRequest request) { DateTime time = DateTime.Now; lock (this.tracers) { foreach (var tracer in this.tracers) { tracer.OnReceivedRequest(time, request); } } }
protected void Respond(INodeEndpointRequest request, object response) { Stream streamResponse = response as Stream; if (streamResponse != null) { request.Respond(streamResponse); } else { request.Respond(this.Serializer.Serialize(response)); } }
public virtual void QueueRequest(INodeEndpointRequest request) { if (this.EnableAsynchronization) { ThreadPool.QueueUserWorkItem(state => { OnQueueRequest((INodeEndpointRequest)state); }, request); } else { OnQueueRequest(request); } }
protected override void OnQueueRequest(INodeEndpointRequest request) { try { MethodInfo method = null; if (this.methods.TryGetValue(request.Method, out method)) { ParameterInfo firstParameter = method.GetParameters().FirstOrDefault(); if (firstParameter != null && firstParameter.ParameterType == typeof(INodeEndpointRequest)) { method.Invoke(this, new object[] { request } .Concat(Translate(method.GetParameters().Skip(1), request.Body)) .ToArray() ); } else { object result = method.Invoke(this, Translate(method.GetParameters(), request.Body)); if (method.ReturnType == typeof(void)) { request.Respond(); } else { Respond(request, result); } } } else { request.Respond(new InvalidOperationException("Method \"" + request.Method + "\" not exists.")); } } catch (TargetInvocationException exception) { request.Respond(exception.InnerException); } catch (Exception) { request.Respond(new InvalidOperationException("Cannot parse parameters.")); } }
void INodeEndpointProtocolRequestListenerTracer.OnReceivedRequest(DateTime time, INodeEndpointRequest request) { if (this.isTracing) { lock (this.tracingResults) { this.tracingResults.Add(new XElement( "Request", new XElement("Date", time.ToLongDateString()), new XElement("Time", time.ToLongTimeString()), new XElement("EndpointName", request.EndpointName), new XElement("Method", request.Method), new XElement("PeerAddress", request.PeerAddress), new XElement("Body", request.Body) )); } } }
public void Div(INodeEndpointRequest request, int a, int b) { Respond(request, a / b); }
public void Mul(INodeEndpointRequest request, int a, int b) { Respond(request, a * b); }
protected abstract void OnQueueRequest(INodeEndpointRequest request);