/// <summary>
        /// Get the stream data
        /// </summary>
        /// <param name="streamDataId"></param>
        /// <returns></returns>
        public System.IO.Stream GetAsyncResponseStreamData(string streamDataId)
        {
            if (streamDataId == null)
            {
                return(null);
            }
            string[] streamDataParts = streamDataId.Split('.');

            Guid clientId = new Guid(streamDataParts[0]);

            QueuedResponsePayload payload = null;

            lock (streamIdToPayloadMap)
            {
                streamIdToPayloadMap.TryGetValue(streamDataId, out payload);
            }

            if (payload != null &&
                payload.ClientId == clientId)
            {
                lock (streamIdToPayloadMap)
                    streamIdToPayloadMap.Remove(streamDataId);

                return(payload.PayloadStream);
            }

            return(null);
        }
        /// <summary>
        /// /// push the result ticket out to the client. The client then needs to turn around and call GetAsyncResponseData
        /// or GetAsyncResponseStreamData to get the data
        /// </summary>
        /// <param name="targetClientProxy"></param>
        /// <param name="message"></param>
        /// <param name="dataAttachment"></param>
        /// <param name="streamAttachment"></param>
        /// <param name="response"></param>
        public void PublishSendResponseTicket(ClientProxy targetClientProxy, string message, object dataAttachment, Stream streamAttachment, AsyncMethodResponse response)
        {
            QueuedResponsePayload payload = null;

            if (dataAttachment != null ||
                streamAttachment != null)
            {
                payload = new QueuedResponsePayload(dataAttachment, response.AsyncTicket, response.ClientId, streamAttachment);
                if (payload.PayloadStream != null)
                {
                    string payloadStreamId = string.Format("{0}.{1}", response.ClientId, payload.PayloadTicket);
                    response.StreamDataId = payloadStreamId;
                    lock (streamIdToPayloadMap)
                        streamIdToPayloadMap[payloadStreamId] = payload;
                }
                else if (payload.PayloadData != null)
                {
                    lock (payloadTicketToResponseMap)
                        payloadTicketToResponseMap[payload.PayloadTicketGuid] = payload;
                }
            }

            Dictionary <Guid, ClientProxy> targetClientProxyMap = new Dictionary <Guid, ClientProxy>();

            targetClientProxyMap.Add(targetClientProxy.ClientId, targetClientProxy);
            PublishSendResponseTicketEventArg psrtea = new PublishSendResponseTicketEventArg(DateTime.UtcNow, response, message, payload);

            this.Publish(targetClientProxyMap, true, psrtea, this.publishSendResponseTicketHandler);
        }
        /// <summary>
        /// called by client to get the async call response
        /// </summary>
        /// <param name="clientId"></param>
        /// <param name="payloadTicket"></param>
        /// <returns></returns>
        public AsyncMethodResponse GetAsyncResponseData(Guid clientId, Guid payloadTicket)
        {
            QueuedResponsePayload payload = null;

            lock (payloadTicketToResponseMap)
            {
                payloadTicketToResponseMap.TryGetValue(payloadTicket, out payload);
            }

            if (payload != null &&
                payload.ClientId == clientId)
            {
                AsyncMethodResponse response = new AsyncMethodResponse(clientId, payload.AsyncTicket);
                response.AsyncResponseData = payload.PayloadData;

                lock (payloadTicketToResponseMap)
                    payloadTicketToResponseMap.Remove(payloadTicket);

                return(response);
            }

            AsyncMethodResponse error = new AsyncMethodResponse(clientId, null);

            error.AddError("Not found", ErrorCode.RecordNotFound);
            return(error);
        }
Exemple #4
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="messageTimeUtc"></param>
 /// <param name="response"></param>
 /// <param name="message"></param>
 /// <param name="payload"></param>
 public PublishSendResponseTicketEventArg(DateTime messageTimeUtc, AsyncMethodResponse response,
                                          string message, QueuedResponsePayload payload)
     : base(messageTimeUtc, response, message)
 {
     this.Payload = payload;
 }