void Serialize(SoapClientMessage message)
        {
            Stream           stream    = message.Stream;
            SoapClientMethod method    = message.Method;
            bool             isEncoded = method.use == SoapBindingUse.Encoded;

            // Serialize the message.
            string envelopeNs = EnvelopeNs;
            string encodingNs = EncodingNs;

            XmlWriter writer = GetWriterForMessage(message, 1024);

            if (writer == null)
            {
                throw new InvalidOperationException(Res.GetString(Res.WebNullWriterForMessage));
            }

            writer.WriteStartDocument();
            writer.WriteStartElement(Soap.Prefix, Soap.Element.Envelope, envelopeNs);
            writer.WriteAttributeString("xmlns", Soap.Prefix, null, envelopeNs);
            if (isEncoded)
            {
                writer.WriteAttributeString("xmlns", "soapenc", null, encodingNs);
                writer.WriteAttributeString("xmlns", "tns", null, clientType.serviceNamespace);
                writer.WriteAttributeString("xmlns", "types", null, SoapReflector.GetEncodedNamespace(clientType.serviceNamespace, clientType.serviceDefaultIsEncoded));
            }
            writer.WriteAttributeString("xmlns", "xsi", null, XmlSchema.InstanceNamespace);
            writer.WriteAttributeString("xmlns", "xsd", null, XmlSchema.Namespace);
            SoapHeaderHandling.WriteHeaders(writer, method.inHeaderSerializer, message.Headers, method.inHeaderMappings, SoapHeaderDirection.In, isEncoded, clientType.serviceNamespace, clientType.serviceDefaultIsEncoded, envelopeNs);
            writer.WriteStartElement(Soap.Element.Body, envelopeNs);
            if (isEncoded && version != SoapProtocolVersion.Soap12) // don't write encodingStyle on soap:Body for soap 1.2
            {
                writer.WriteAttributeString("soap", Soap.Attribute.EncodingStyle, null, encodingNs);
            }

            object[]    parameters = message.GetParameterValues();
            TraceMethod caller     = Tracing.On ? new TraceMethod(this, "Serialize") : null;

            if (Tracing.On)
            {
                Tracing.Enter(Tracing.TraceId(Res.TraceWriteRequest), caller, new TraceMethod(method.parameterSerializer, "Serialize", writer, parameters, null, isEncoded ? encodingNs : null));
            }
            method.parameterSerializer.Serialize(writer, parameters, null, isEncoded ? encodingNs : null);
            if (Tracing.On)
            {
                Tracing.Exit(Tracing.TraceId(Res.TraceWriteRequest), caller);
            }

            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.Flush();

            // run the after serialize extension pass.
            message.SetStage(SoapMessageStage.AfterSerialize);
            message.RunExtensions(message.initializedExtensions, true);
        }
Ejemplo n.º 2
0
        private void Serialize(SoapClientMessage message)
        {
            Stream           stream           = message.Stream;
            SoapClientMethod method           = message.Method;
            bool             isEncoded        = method.use == SoapBindingUse.Encoded;
            string           envelopeNs       = this.EnvelopeNs;
            string           encodingNs       = this.EncodingNs;
            XmlWriter        writerForMessage = this.GetWriterForMessage(message, 0x400);

            if (writerForMessage == null)
            {
                throw new InvalidOperationException(System.Web.Services.Res.GetString("WebNullWriterForMessage"));
            }
            writerForMessage.WriteStartDocument();
            writerForMessage.WriteStartElement("soap", "Envelope", envelopeNs);
            writerForMessage.WriteAttributeString("xmlns", "soap", null, envelopeNs);
            if (isEncoded)
            {
                writerForMessage.WriteAttributeString("xmlns", "soapenc", null, encodingNs);
                writerForMessage.WriteAttributeString("xmlns", "tns", null, this.clientType.serviceNamespace);
                writerForMessage.WriteAttributeString("xmlns", "types", null, SoapReflector.GetEncodedNamespace(this.clientType.serviceNamespace, this.clientType.serviceDefaultIsEncoded));
            }
            writerForMessage.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
            writerForMessage.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema");
            SoapHeaderHandling.WriteHeaders(writerForMessage, method.inHeaderSerializer, message.Headers, method.inHeaderMappings, SoapHeaderDirection.In, isEncoded, this.clientType.serviceNamespace, this.clientType.serviceDefaultIsEncoded, envelopeNs);
            writerForMessage.WriteStartElement("Body", envelopeNs);
            if (isEncoded && (this.version != SoapProtocolVersion.Soap12))
            {
                writerForMessage.WriteAttributeString("soap", "encodingStyle", null, encodingNs);
            }
            object[]    parameterValues = message.GetParameterValues();
            TraceMethod caller          = Tracing.On ? new TraceMethod(this, "Serialize", new object[0]) : null;

            if (Tracing.On)
            {
                object[] args = new object[4];
                args[0] = writerForMessage;
                args[1] = parameterValues;
                args[3] = isEncoded ? encodingNs : null;
                Tracing.Enter(Tracing.TraceId("TraceWriteRequest"), caller, new TraceMethod(method.parameterSerializer, "Serialize", args));
            }
            method.parameterSerializer.Serialize(writerForMessage, parameterValues, null, isEncoded ? encodingNs : null);
            if (Tracing.On)
            {
                Tracing.Exit(Tracing.TraceId("TraceWriteRequest"), caller);
            }
            writerForMessage.WriteEndElement();
            writerForMessage.WriteEndElement();
            writerForMessage.Flush();
            message.SetStage(SoapMessageStage.AfterSerialize);
            message.RunExtensions(message.initializedExtensions, true);
        }
Ejemplo n.º 3
0
        void Serialize(SoapClientMessage message)
        {
            Stream           stream    = message.Stream;
            SoapClientMethod method    = message.Method;
            bool             isEncoded = method.use == SoapBindingUse.Encoded;
            // Serialize the message.
            string        envelopeNs = EnvelopeNs;
            string        encodingNs = EncodingNs;
            StreamWriter  sw         = new StreamWriter(stream, RequestEncoding != null ? RequestEncoding : new UTF8Encoding(false), 128);
            XmlTextWriter writer     = isEncoded && message.Headers.Count > 0 ? new XmlSpecialTextWriter(sw, version) : new XmlTextWriter(sw);

            writer.WriteStartDocument();
            writer.WriteStartElement("soap", Soap.Envelope, envelopeNs);
            writer.WriteAttributeString("xmlns", "soap", null, envelopeNs);
            if (isEncoded)
            {
                writer.WriteAttributeString("xmlns", "soapenc", null, encodingNs);
                writer.WriteAttributeString("xmlns", "tns", null, clientType.serviceNamespace);
                writer.WriteAttributeString("xmlns", "types", null, SoapReflector.GetEncodedNamespace(clientType.serviceNamespace, clientType.serviceDefaultIsEncoded));
            }
            writer.WriteAttributeString("xmlns", "xsi", null, XmlSchema.InstanceNamespace);
            writer.WriteAttributeString("xmlns", "xsd", null, XmlSchema.Namespace);
            SoapHeaderHandling.WriteHeaders(writer, method.inHeaderSerializer, message.Headers, method.inHeaderMappings, SoapHeaderDirection.In, isEncoded, clientType.serviceNamespace, clientType.serviceDefaultIsEncoded, envelopeNs);
            writer.WriteStartElement(Soap.Body, envelopeNs);
            if (isEncoded)
            {
                writer.WriteAttributeString("soap", Soap.EncodingStyle, null, encodingNs);
            }
            // SOAP12: not using encodingStyle
            //method.parameterSerializer.Serialize(writer, message.GetParameterValues(), null, isEncoded ? encodingNs : null);
            method.parameterSerializer.Serialize(writer, message.GetParameterValues(), null);
            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.Flush();

            // run the after serialize extension pass.
            message.SetStage(SoapMessageStage.AfterSerialize);
            message.RunExtensions(message.initializedExtensions);
        }
Ejemplo n.º 4
0
 internal override void WriteReturns(object[] returnValues, Stream outputStream)
 {
     if (!this.serverMethod.oneWay)
     {
         bool isEncoded = this.serverMethod.use == SoapBindingUse.Encoded;
         SoapHeaderHandling.EnsureHeadersUnderstood(this.message.Headers);
         this.message.Headers.Clear();
         SoapHeaderHandling.GetHeaderMembers(this.message.Headers, this.Target, this.serverMethod.outHeaderMappings, SoapHeaderDirection.Out, false);
         if (this.message.allExtensions != null)
         {
             this.message.SetExtensionStream(new SoapExtensionStream());
         }
         this.message.InitExtensionStreamChain(this.message.allExtensions);
         this.message.SetStage(SoapMessageStage.BeforeSerialize);
         this.message.ContentType = ContentType.Compose(this.helper.HttpContentType, Encoding.UTF8);
         this.message.SetParameterValues(returnValues);
         this.message.RunExtensions(this.message.allExtensions, true);
         this.message.SetStream(outputStream);
         base.Response.ContentType = this.message.ContentType;
         if ((this.message.ContentEncoding != null) && (this.message.ContentEncoding.Length > 0))
         {
             base.Response.AppendHeader("Content-Encoding", this.message.ContentEncoding);
         }
         XmlWriter writerForMessage = this.GetWriterForMessage(this.message, 0x400);
         if (writerForMessage == null)
         {
             throw new InvalidOperationException(System.Web.Services.Res.GetString("WebNullWriterForMessage"));
         }
         writerForMessage.WriteStartDocument();
         writerForMessage.WriteStartElement("soap", "Envelope", this.helper.EnvelopeNs);
         writerForMessage.WriteAttributeString("xmlns", "soap", null, this.helper.EnvelopeNs);
         if (isEncoded)
         {
             writerForMessage.WriteAttributeString("xmlns", "soapenc", null, this.helper.EncodingNs);
             writerForMessage.WriteAttributeString("xmlns", "tns", null, this.serverType.serviceNamespace);
             writerForMessage.WriteAttributeString("xmlns", "types", null, SoapReflector.GetEncodedNamespace(this.serverType.serviceNamespace, this.serverType.serviceDefaultIsEncoded));
         }
         if (this.serverMethod.rpc && (this.version == SoapProtocolVersion.Soap12))
         {
             writerForMessage.WriteAttributeString("xmlns", "rpc", null, "http://www.w3.org/2003/05/soap-rpc");
         }
         writerForMessage.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
         writerForMessage.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema");
         SoapHeaderHandling.WriteHeaders(writerForMessage, this.serverMethod.outHeaderSerializer, this.message.Headers, this.serverMethod.outHeaderMappings, SoapHeaderDirection.Out, isEncoded, this.serverType.serviceNamespace, this.serverType.serviceDefaultIsEncoded, this.helper.EnvelopeNs);
         writerForMessage.WriteStartElement("Body", this.helper.EnvelopeNs);
         if (isEncoded && (this.version != SoapProtocolVersion.Soap12))
         {
             writerForMessage.WriteAttributeString("soap", "encodingStyle", null, this.helper.EncodingNs);
         }
         TraceMethod caller = Tracing.On ? new TraceMethod(this, "WriteReturns", new object[0]) : null;
         if (Tracing.On)
         {
             object[] args = new object[4];
             args[0] = writerForMessage;
             args[1] = returnValues;
             args[3] = isEncoded ? this.helper.EncodingNs : null;
             Tracing.Enter(Tracing.TraceId("TraceWriteResponse"), caller, new TraceMethod(this.serverMethod.returnSerializer, "Serialize", args));
         }
         this.serverMethod.returnSerializer.Serialize(writerForMessage, returnValues, null, isEncoded ? this.helper.EncodingNs : null);
         if (Tracing.On)
         {
             Tracing.Exit(Tracing.TraceId("TraceWriteResponse"), caller);
         }
         writerForMessage.WriteEndElement();
         writerForMessage.WriteEndElement();
         writerForMessage.Flush();
         this.message.SetStage(SoapMessageStage.AfterSerialize);
         this.message.RunExtensions(this.message.allExtensions, true);
     }
 }
Ejemplo n.º 5
0
        internal override void WriteReturns(object[] returnValues, Stream outputStream)
        {
            if (serverMethod.oneWay)
            {
                return;
            }
            bool isEncoded = serverMethod.use == SoapBindingUse.Encoded;

            SoapHeaderHandling.EnsureHeadersUnderstood(message.Headers);
            message.Headers.Clear();
            SoapHeaderHandling.GetHeaderMembers(message.Headers, this.Target, serverMethod.outHeaderMappings, SoapHeaderDirection.Out, false);

            if (message.allExtensions != null)
            {
                message.SetExtensionStream(new SoapExtensionStream());
            }

            message.InitExtensionStreamChain(message.allExtensions);

            message.SetStage(SoapMessageStage.BeforeSerialize);
            message.ContentType = ContentType.Compose(helper.HttpContentType, Encoding.UTF8);
            message.SetParameterValues(returnValues);
            message.RunExtensions(message.allExtensions);

            message.SetStream(outputStream);
            Response.ContentType = message.ContentType;
            if (message.ContentEncoding != null && message.ContentEncoding.Length > 0)
            {
                Response.AppendHeader(ContentType.ContentEncoding, message.ContentEncoding);
            }

            StreamWriter  sw     = new StreamWriter(message.Stream, new UTF8Encoding(false), 128);
            XmlTextWriter writer = isEncoded && message.Headers.Count > 0 ? new XmlSpecialTextWriter(sw, helper.Version) : new XmlTextWriter(sw);

            writer.WriteStartDocument();
            writer.WriteStartElement("soap", Soap.Envelope, helper.EnvelopeNs);
            writer.WriteAttributeString("xmlns", "soap", null, helper.EnvelopeNs);
            if (isEncoded)
            {
                writer.WriteAttributeString("xmlns", "soapenc", null, helper.EncodingNs);
                writer.WriteAttributeString("xmlns", "tns", null, serverType.serviceNamespace);
                writer.WriteAttributeString("xmlns", "types", null, SoapReflector.GetEncodedNamespace(serverType.serviceNamespace, serverType.serviceDefaultIsEncoded));
            }
            if (serverMethod.rpc && version == SoapProtocolVersion.Soap12)
            {
                writer.WriteAttributeString("xmlns", "rpc", null, Soap12.RpcNamespace);
            }
            writer.WriteAttributeString("xmlns", "xsi", null, XmlSchema.InstanceNamespace);
            writer.WriteAttributeString("xmlns", "xsd", null, XmlSchema.Namespace);
            SoapHeaderHandling.WriteHeaders(writer, serverMethod.outHeaderSerializer, message.Headers, serverMethod.outHeaderMappings, SoapHeaderDirection.Out, isEncoded, serverType.serviceNamespace, serverType.serviceDefaultIsEncoded, helper.EnvelopeNs);
            writer.WriteStartElement(Soap.Body, helper.EnvelopeNs);
            if (isEncoded)
            {
                writer.WriteAttributeString("soap", Soap.EncodingStyle, null, helper.EncodingNs);
            }
            // SOAP12: not using encodingStyle
            //serverMethod.returnSerializer.Serialize(writer, returnValues, null, isEncoded ? helper.EncodingNs : null);
            serverMethod.returnSerializer.Serialize(writer, returnValues, null);
            writer.WriteEndElement();
            writer.WriteEndElement();
            writer.Flush();

            message.SetStage(SoapMessageStage.AfterSerialize);
            message.RunExtensions(message.allExtensions);
        }