public void AsyncProcessResponse(IServerResponseChannelSinkStack sinkStack, object state, IMessage msg, ITransportHeaders headers, Stream stream) { ITransportHeaders responseHeaders = new TransportHeaders(); if (sinkStack != null) { stream = sinkStack.GetResponseStream(msg, responseHeaders); } if (stream == null) { stream = new MemoryStream(); } SoapMessageFormatter soapMsgFormatter = (SoapMessageFormatter)state; SoapMessage soapMessage = (SoapMessage)soapMsgFormatter.BuildSoapMessageFromMethodResponse((IMethodReturnMessage)msg, out responseHeaders); _soapCore.Serializer.Serialize(stream, soapMessage, null); if (stream is MemoryStream) { stream.Position = 0; } sinkStack.AsyncProcessResponse(msg, responseHeaders, stream); }
public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream) { responseMsg = null; responseHeaders = null; responseStream = null; ServerProcessing sp; SoapMessageFormatter soapMsgFormatter = new SoapMessageFormatter(); sinkStack.Push(this, soapMsgFormatter); try { string url = (string)requestHeaders[CommonTransportKeys.RequestUri]; string uri; _receiver.Parse(url, out uri); if(uri == null) uri = url; Type serverType = RemotingServices.GetServerTypeForUri(uri); if (serverType == null) throw new RemotingException ("No receiver for uri " + uri); SoapFormatter fm = _soapCore.GetSafeDeserializer (); SoapMessage soapMessage = soapMsgFormatter.CreateSoapMessage (true); fm.TopObject = soapMessage; requestStream.Position = 0; fm.Deserialize(requestStream); requestMsg = soapMsgFormatter.BuildMethodCallFromSoapMessage(soapMessage, uri); sp = next_sink.ProcessMessage(sinkStack, requestMsg, requestHeaders, null, out responseMsg, out responseHeaders, out responseStream); if(sp == ServerProcessing.Complete) { if(responseMsg != null && responseStream == null) { object rtnMessageObject = soapMsgFormatter.BuildSoapMessageFromMethodResponse((IMethodReturnMessage) responseMsg, out responseHeaders); responseStream = new MemoryStream(); _soapCore.Serializer.Serialize(responseStream, rtnMessageObject); } } } catch(Exception e) { responseMsg = (IMethodReturnMessage)new ReturnMessage(e, (IMethodCallMessage)requestMsg); object rtnMessageObject = soapMsgFormatter.BuildSoapMessageFromMethodResponse((IMethodReturnMessage) responseMsg, out responseHeaders); responseStream = new MemoryStream(); _soapCore.Serializer.Serialize(responseStream, rtnMessageObject); sp = ServerProcessing.Complete; } if (sp == ServerProcessing.Complete) sinkStack.Pop(this); return sp; }
public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream) { // Check whether the request was already processed by another // formatter sink and pass the request to the next sink if so. if (requestMsg != null) { return(next_sink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream)); } // Check whether the request is suitable for this formatter // and pass the request to the next sink if not. // Note that a null content-type is handled as suitable, // otherwise no other sink will be able to handle the request. string contentType = requestHeaders["Content-Type"] as string; if (contentType == null || !contentType.StartsWith("text/xml") || requestHeaders["SOAPAction"] == null) { return(next_sink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream)); } responseMsg = null; responseHeaders = null; responseStream = null; ServerProcessing sp; SoapMessageFormatter soapMsgFormatter = new SoapMessageFormatter(); sinkStack.Push(this, soapMsgFormatter); try { string url = (string)requestHeaders[CommonTransportKeys.RequestUri]; string uri; _receiver.Parse(url, out uri); if (uri == null) { uri = url; } Type serverType = RemotingServices.GetServerTypeForUri(uri); if (serverType == null) { throw new RemotingException("No receiver for uri " + uri); } SoapFormatter fm = _soapCore.GetSafeDeserializer(); SoapMessage soapMessage = soapMsgFormatter.CreateSoapMessage(true); fm.TopObject = soapMessage; fm.Deserialize(requestStream); requestMsg = soapMsgFormatter.BuildMethodCallFromSoapMessage(soapMessage, uri); sp = next_sink.ProcessMessage(sinkStack, requestMsg, requestHeaders, null, out responseMsg, out responseHeaders, out responseStream); if (sp == ServerProcessing.Complete) { if (responseMsg != null && responseStream == null) { object rtnMessageObject = soapMsgFormatter.BuildSoapMessageFromMethodResponse((IMethodReturnMessage)responseMsg, out responseHeaders); responseStream = new MemoryStream(); _soapCore.Serializer.Serialize(responseStream, rtnMessageObject); responseStream.Position = 0; } } } catch (Exception e) { responseMsg = (IMethodReturnMessage) new ReturnMessage(e, (IMethodCallMessage)requestMsg); object rtnMessageObject = soapMsgFormatter.BuildSoapMessageFromMethodResponse((IMethodReturnMessage)responseMsg, out responseHeaders); responseStream = new MemoryStream(); _soapCore.Serializer.Serialize(responseStream, rtnMessageObject); responseStream.Position = 0; sp = ServerProcessing.Complete; } if (sp == ServerProcessing.Complete) { sinkStack.Pop(this); } return(sp); }
public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream) { // Check whether the request was already processed by another // formatter sink and pass the request to the next sink if so. if (requestMsg != null) return next_sink.ProcessMessage (sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); // Check whether the request is suitable for this formatter // and pass the request to the next sink if not. // Note that a null content-type is handled as suitable, // otherwise no other sink will be able to handle the request. string contentType = requestHeaders["Content-Type"] as string; if (contentType == null || !contentType.StartsWith ("text/xml") || requestHeaders["SOAPAction"] == null) { return next_sink.ProcessMessage (sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); } responseMsg = null; responseHeaders = null; responseStream = null; ServerProcessing sp; SoapMessageFormatter soapMsgFormatter = new SoapMessageFormatter(); sinkStack.Push(this, soapMsgFormatter); try { string url = (string)requestHeaders[CommonTransportKeys.RequestUri]; string uri; _receiver.Parse(url, out uri); if(uri == null) uri = url; Type serverType = RemotingServices.GetServerTypeForUri(uri); if (serverType == null) throw new RemotingException ("No receiver for uri " + uri); SoapFormatter fm = _soapCore.GetSafeDeserializer (); SoapMessage soapMessage = soapMsgFormatter.CreateSoapMessage (true); fm.TopObject = soapMessage; fm.Deserialize(requestStream); requestMsg = soapMsgFormatter.BuildMethodCallFromSoapMessage(soapMessage, uri); sp = next_sink.ProcessMessage(sinkStack, requestMsg, requestHeaders, null, out responseMsg, out responseHeaders, out responseStream); if(sp == ServerProcessing.Complete) { if(responseMsg != null && responseStream == null) { object rtnMessageObject = soapMsgFormatter.BuildSoapMessageFromMethodResponse((IMethodReturnMessage) responseMsg, out responseHeaders); responseStream = new MemoryStream(); _soapCore.Serializer.Serialize(responseStream, rtnMessageObject); responseStream.Position = 0; } } } catch(Exception e) { responseMsg = (IMethodReturnMessage)new ReturnMessage(e, (IMethodCallMessage)requestMsg); object rtnMessageObject = soapMsgFormatter.BuildSoapMessageFromMethodResponse((IMethodReturnMessage) responseMsg, out responseHeaders); responseStream = new MemoryStream(); _soapCore.Serializer.Serialize(responseStream, rtnMessageObject); responseStream.Position = 0; sp = ServerProcessing.Complete; } if (sp == ServerProcessing.Complete) sinkStack.Pop(this); return sp; }