Exemplo n.º 1
0
        void SendRequest(Stream s, SoapClientMessage message, SoapExtension[] extensions)
        {
            using (s) {
                if (extensions != null)
                {
                    s = SoapExtension.ExecuteChainStream(extensions, s);
                    message.SetStage(SoapMessageStage.BeforeSerialize);
                    SoapExtension.ExecuteProcessMessage(extensions, message, s, true);
                }

                XmlTextWriter xtw = WebServiceHelper.CreateXmlWriter(s);
                WebServiceHelper.WriteSoapMessage(xtw, message.MethodStubInfo, SoapHeaderDirection.In, message.Parameters, message.Headers, message.IsSoap12);

                if (extensions != null)
                {
                    message.SetStage(SoapMessageStage.AfterSerialize);
                    SoapExtension.ExecuteProcessMessage(extensions, message, s, true);
                }

                xtw.Flush();
                xtw.Close();
            }
        }
Exemplo n.º 2
0
        void SerializeResponse(HttpResponse response, SoapServerMessage message)
        {
            SoapMethodStubInfo methodInfo = message.MethodStubInfo;

            if ((message.ContentEncoding != null) && (message.ContentEncoding.Length > 0))
            {
                response.AppendHeader("Content-Encoding", message.ContentEncoding);
            }

            response.ContentType = message.IsSoap12 ?
                                   "application/soap+xml; charset=utf-8" :
                                   "text/xml; charset=utf-8";
            if (message.Exception != null)
            {
                response.StatusCode = 500;
            }

            Stream responseStream = response.OutputStream;
            Stream outStream      = responseStream;
            bool   bufferResponse = (methodInfo == null || methodInfo.MethodAttribute.BufferResponse);

            response.BufferOutput = bufferResponse;

            try
            {
                // While serializing, process extensions in reverse order

                if (bufferResponse)
                {
                    outStream = SoapExtension.ExecuteChainStream(_extensionChainHighPrio, outStream);
                    outStream = SoapExtension.ExecuteChainStream(_extensionChainMedPrio, outStream);
                    outStream = SoapExtension.ExecuteChainStream(_extensionChainLowPrio, outStream);

                    message.SetStage(SoapMessageStage.BeforeSerialize);
                    SoapExtension.ExecuteProcessMessage(_extensionChainLowPrio, message, outStream, true);
                    SoapExtension.ExecuteProcessMessage(_extensionChainMedPrio, message, outStream, true);
                    SoapExtension.ExecuteProcessMessage(_extensionChainHighPrio, message, outStream, true);
                }

                XmlTextWriter xtw = WebServiceHelper.CreateXmlWriter(outStream);


                if (message.Exception == null)
                {
                    WebServiceHelper.WriteSoapMessage(xtw, methodInfo, SoapHeaderDirection.Out, message.OutParameters, message.Headers, message.IsSoap12);
                }
                else if (methodInfo != null)
                {
                    if (message.IsSoap12)
                    {
                        WebServiceHelper.WriteSoapMessage(xtw, methodInfo, SoapHeaderDirection.Fault, new Soap12Fault(message.Exception), message.Headers, message.IsSoap12);
                    }
                    else
                    {
                        WebServiceHelper.WriteSoapMessage(xtw, methodInfo, SoapHeaderDirection.Fault, new Fault(message.Exception), message.Headers, message.IsSoap12);
                    }
                }
                else
                {
                    if (message.IsSoap12)
                    {
                        WebServiceHelper.WriteSoapMessage(xtw, SoapBindingUse.Literal, Soap12Fault.Serializer, null, new Soap12Fault(message.Exception), null, message.IsSoap12);
                    }
                    else
                    {
                        WebServiceHelper.WriteSoapMessage(xtw, SoapBindingUse.Literal, Fault.Serializer, null, new Fault(message.Exception), null, message.IsSoap12);
                    }
                }

                if (bufferResponse)
                {
                    message.SetStage(SoapMessageStage.AfterSerialize);
                    SoapExtension.ExecuteProcessMessage(_extensionChainLowPrio, message, outStream, true);
                    SoapExtension.ExecuteProcessMessage(_extensionChainMedPrio, message, outStream, true);
                    SoapExtension.ExecuteProcessMessage(_extensionChainHighPrio, message, outStream, true);
                }

                xtw.Flush();
            }
            catch (Exception ex)
            {
                // If the response is buffered, we can discard the response and
                // serialize a new Fault message as response.
                if (bufferResponse)
                {
                    throw ex;
                }

                // If it is not buffered, we can't rollback what has been sent,
                // so we can only close the connection and return.
                responseStream.Close();
                return;
            }
        }