コード例 #1
0
        public IPCDispatchResult Dispatch(IIPCMessage message)
        {
            string receaverUri = new IPCUri(_receaverID, IPCBaseMessagesQueue.URISuffix).Value;

            _receaverQueue = (IPCBaseMessagesQueue)Activator.GetObject(typeof(IPCBaseMessagesQueue),
                receaverUri);

            // check if message is valid
            if (message == null || !message.IsValid) {
                return IPCDispatchResult.InvalidMessageClass;
            }

            try {
                if (RemotingServices.IsTransparentProxy(_receaverQueue)) {
                    switch (message.MessageType) {
                        case IPCDispatchType.Async:
                            return DoDispatchAsyncMessage(message as IPCBaseAsyncMessage, _receaverQueue);
                        case IPCDispatchType.Sync:
                            return DoDispatchSyncMessage(message as IPCBaseSyncMessage, _receaverQueue);
                        default:
                            break;
                    }
                }
            } catch (Exception ex) {
                if (ex is RemotingException) {
                    return IPCDispatchResult.ReceaverNotExists;
                }
                if (ex is SerializationException) {
                    return IPCDispatchResult.InvalidMessageClass;
                }
                return IPCDispatchResult.UnexpectedFail;
            }
            return IPCDispatchResult.Success;
        }
コード例 #2
0
        public IPCDispatchResult Dispatch(IIPCMessage message)
        {
            string receaverUri = new IPCUri(_receaverID, IPCBaseMessagesQueue.URISuffix).Value;

            _receaverQueue = (IPCBaseMessagesQueue)Activator.GetObject(typeof(IPCBaseMessagesQueue),
                                                                       receaverUri);

            // check if message is valid
            if (message == null || !message.IsValid)
            {
                return(IPCDispatchResult.InvalidMessageClass);
            }

            try {
                if (RemotingServices.IsTransparentProxy(_receaverQueue))
                {
                    switch (message.MessageType)
                    {
                    case IPCDispatchType.Async:
                        return(DoDispatchAsyncMessage(message as IPCBaseAsyncMessage, _receaverQueue));

                    case IPCDispatchType.Sync:
                        return(DoDispatchSyncMessage(message as IPCBaseSyncMessage, _receaverQueue));

                    default:
                        break;
                    }
                }
            } catch (Exception ex) {
                if (ex is RemotingException)
                {
                    return(IPCDispatchResult.ReceaverNotExists);
                }
                if (ex is SerializationException)
                {
                    return(IPCDispatchResult.InvalidMessageClass);
                }
                return(IPCDispatchResult.UnexpectedFail);
            }
            return(IPCDispatchResult.Success);
        }
コード例 #3
0
        public BaseIPCReceaver()
        {
            _ownGUID = new IPCReceaverGUID();
            _currentWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset,
                 _ownGUID.Value);
            _currentQueue = DoCreateQueue();

            // do not use security
            // ensure that IPC server is alive
            if (!ChannelServices.RegisteredChannels.Any(i => i.ChannelName == _ownGUID.Value)) {
                channel = new IpcServerChannel(_ownGUID.Value, _ownGUID.Value);
                if (!ChannelServices.RegisteredChannels.Any(i => i == channel)) {
                    ChannelServices.RegisterChannel(channel, false);
                }
            }

            RemotingServices.Marshal(_currentQueue,
                _currentQueue.UriSuffix,
                typeof(IPCBaseMessagesQueue));
            _worker = new Thread(ListenQueue);
            _worker.Start();
        }
コード例 #4
0
        public BaseIPCReceaver()
        {
            _ownGUID           = new IPCReceaverGUID();
            _currentWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset,
                                                     _ownGUID.Value);
            _currentQueue = DoCreateQueue();

            // do not use security
            // ensure that IPC server is alive
            if (!ChannelServices.RegisteredChannels.Any(i => i.ChannelName == _ownGUID.Value))
            {
                channel = new IpcServerChannel(_ownGUID.Value, _ownGUID.Value);
                if (!ChannelServices.RegisteredChannels.Any(i => i == channel))
                {
                    ChannelServices.RegisterChannel(channel, false);
                }
            }

            RemotingServices.Marshal(_currentQueue,
                                     _currentQueue.UriSuffix,
                                     typeof(IPCBaseMessagesQueue));
            _worker = new Thread(ListenQueue);
            _worker.Start();
        }
コード例 #5
0
        internal virtual IPCDispatchResult DoDispatchSyncMessage(IPCBaseSyncMessage message, IPCBaseMessagesQueue receaverQueue)
        {
            // ensure that IPC server is alive
            if (!ChannelServices.RegisteredChannels.Any(i => i.ChannelName == _dispatcherID.Value)) {
                serverChannel = new IpcServerChannel(_dispatcherID.Value, _dispatcherID.Value);
                if (!ChannelServices.RegisteredChannels.Any(i => i == serverChannel)) {
                    ChannelServices.RegisterChannel(serverChannel, false);
                }
            }

            // share object
            RemotingServices.Marshal(message,
                message.UriSuffix,
                message.GetType());
            try {
                // notify receaver
                IIPCGUID helperID = new IPCGUID(message.GetHashCode());
                IPCSyncHelperMessage helperMessage = new IPCSyncHelperMessage(new IPCUri(_dispatcherID, message).Value, message.GetType(), helperID);
                helperMessage.DispatherID = _dispatcherID;
                message.DispatherID = _dispatcherID;
                receaverQueue.EnqueueMessage(helperMessage);
                _receaverWaitHandle.Set();
                if (!_dispatcherWaitHandle.WaitOne(message.TimeOut))
                    return IPCDispatchResult.Timeout;
            } finally {
                RemotingServices.Disconnect(message);
            }
            return IPCDispatchResult.Success;
        }
コード例 #6
0
 internal virtual IPCDispatchResult DoDispatchAsyncMessage(IPCBaseAsyncMessage message, IPCBaseMessagesQueue receaverQueue)
 {
     _receaverQueue.EnqueueMessage(message);
     _receaverWaitHandle.Set();
     return IPCDispatchResult.Success;
 }
コード例 #7
0
        internal virtual IPCDispatchResult DoDispatchSyncMessage(IPCBaseSyncMessage message, IPCBaseMessagesQueue receaverQueue)
        {
            // ensure that IPC server is alive
            if (!ChannelServices.RegisteredChannels.Any(i => i.ChannelName == _dispatcherID.Value))
            {
                serverChannel = new IpcServerChannel(_dispatcherID.Value, _dispatcherID.Value);
                if (!ChannelServices.RegisteredChannels.Any(i => i == serverChannel))
                {
                    ChannelServices.RegisterChannel(serverChannel, false);
                }
            }

            // share object
            RemotingServices.Marshal(message,
                                     message.UriSuffix,
                                     message.GetType());
            try {
                // notify receaver
                IIPCGUID             helperID      = new IPCGUID(message.GetHashCode());
                IPCSyncHelperMessage helperMessage = new IPCSyncHelperMessage(new IPCUri(_dispatcherID, message).Value, message.GetType(), helperID);
                helperMessage.DispatherID = _dispatcherID;
                message.DispatherID       = _dispatcherID;
                receaverQueue.EnqueueMessage(helperMessage);
                _receaverWaitHandle.Set();
                if (!_dispatcherWaitHandle.WaitOne(message.TimeOut))
                {
                    return(IPCDispatchResult.Timeout);
                }
            } finally {
                RemotingServices.Disconnect(message);
            }
            return(IPCDispatchResult.Success);
        }
コード例 #8
0
 internal virtual IPCDispatchResult DoDispatchAsyncMessage(IPCBaseAsyncMessage message, IPCBaseMessagesQueue receaverQueue)
 {
     _receaverQueue.EnqueueMessage(message);
     _receaverWaitHandle.Set();
     return(IPCDispatchResult.Success);
 }