ResponseBodyWriter.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataWeb / Server / System / Data / Services / ResponseBodyWriter.cs / 2 / ResponseBodyWriter.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//  
//      Provides a base class for DataWeb services.
//  
// 
// @owner  [....]
//--------------------------------------------------------------------- 

namespace System.Data.Services
{
    using System; 
    using System.Collections;
    using System.Collections.Generic; 
    using System.Data.Objects; 
    using System.Diagnostics;
    using System.IO; 
    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.Text;
    using System.Xml; 
    using System.Data.Services.Providers;
    using System.Data.Services.Serializers; 
 
    /// 
    /// Use this class to encapsulate writing the body of the outgoing response 
    /// for a data request.
    /// 
    internal class ResponseBodyWriter
    { 
        /// Encoding, if available.
        private readonly Encoding encoding; 
 
        /// Whether  has already moved.
        private readonly bool hasMoved; 

        /// Host for the request being processed.
        private readonly IDataService service;
 
        /// Enumerator for results.
        private readonly IEnumerator queryResults; 
 
        /// Description of request made to the system.
        private readonly RequestDescription requestDescription; 

        /// Content format for response.
        private readonly ContentFormat responseFormat;
 
        /// Initializes a new  that can write the body of a response.
        /// Encoding, if available. 
        /// Whether  has already moved. 
        /// Service for the request being processed.
        /// Enumerator for results. 
        /// Description of request made to the system.
        /// Content format for response.
        internal ResponseBodyWriter(
            Encoding encoding, 
            bool hasMoved,
            IDataService service, 
            IEnumerator queryResults, 
            RequestDescription requestDescription,
            ContentFormat responseFormat) 
        {
            Debug.Assert(responseFormat != ContentFormat.Unknown, "responseFormat != ContentFormat.Unknown");
            this.encoding = encoding;
            this.hasMoved = hasMoved; 
            this.service = service;
            this.queryResults = queryResults; 
            this.requestDescription = requestDescription; 
            this.responseFormat = responseFormat;
        } 

        /// Gets the absolute URI to the service.
        internal Uri AbsoluteServiceUri
        { 
            get { return this.service.RequestParams.AbsoluteServiceUri; }
        } 
 
        /// Gets the  for this response.
        internal IDataServiceHost Host 
        {
            get { return this.service.Host; }
        }
 
        /// Gets the  for this response.
        internal IDataServiceProvider Provider 
        { 
            get { return this.service.Provider; }
        } 

        /// Writes the request body to the specified .
        /// Stream to write to.
        internal void Write(Stream stream) 
        {
            Debug.Assert(stream != null, "stream != null"); 
            IExceptionWriter exceptionWriter = null; 
            try
            { 
                switch (this.responseFormat)
                {
                    case ContentFormat.Binary:
                        Debug.Assert( 
#if ASTORIA_OPEN_OBJECT
                            this.requestDescription.TargetKind == RequestTargetKind.OpenPropertyValue || 
#endif 
                            this.requestDescription.TargetKind == RequestTargetKind.PrimitiveValue,
                            this.requestDescription.TargetKind + " is PrimitiveValue or OpenPropertyValue"); 

                        BinarySerializer binarySerializer = new BinarySerializer(stream);
                        exceptionWriter = binarySerializer;
                        binarySerializer.WriteRequest(this.queryResults.Current); 
                        break;
 
                    case ContentFormat.Text: 
                        Debug.Assert(
#if ASTORIA_OPEN_OBJECT 
                            this.requestDescription.TargetKind == RequestTargetKind.OpenPropertyValue ||
#endif
                            this.requestDescription.TargetKind == RequestTargetKind.PrimitiveValue,
                            this.requestDescription.TargetKind + " is PrimitiveValue or OpenPropertyValue"); 

                        TextSerializer textSerializer = new TextSerializer(stream, this.encoding); 
                        exceptionWriter = textSerializer; 
                        textSerializer.WriteRequest(this.queryResults.Current);
                        break; 

                    case ContentFormat.Atom:
                    case ContentFormat.Json:
                    case ContentFormat.PlainXml: 
                        Debug.Assert(this.requestDescription.TargetKind != RequestTargetKind.PrimitiveValue, "this.requestDescription.TargetKind != RequestTargetKind.PrimitiveValue");
#if ASTORIA_OPEN_OBJECT 
                        Debug.Assert(this.requestDescription.TargetKind != RequestTargetKind.OpenPropertyValue, "this.requestDescription.TargetKind != RequestTargetKind.OpenPropertyValue"); 
#endif
                        Debug.Assert(this.requestDescription.TargetKind != RequestTargetKind.Metadata, "this.requestDescription.TargetKind != RequestTargetKind.Metadata"); 

                        if (this.requestDescription.TargetKind == RequestTargetKind.ServiceDirectory)
                        {
                            if (this.responseFormat == ContentFormat.Json) 
                            {
                                JsonServiceDocumentSerializer serviceSerializer = new JsonServiceDocumentSerializer(stream, this.Provider, this.encoding); 
                                exceptionWriter = serviceSerializer; 
                                serviceSerializer.WriteRequest();
                                break; 
                            }
                            else
                            {
                                AtomServiceDocumentSerializer serviceSerializer = new AtomServiceDocumentSerializer(stream, this.AbsoluteServiceUri, this.Provider, this.encoding); 
                                exceptionWriter = serviceSerializer;
                                serviceSerializer.WriteRequest(); 
                            } 
                        }
                        else 
                        {
                            Serializer serializer;
                            if (ContentFormat.Json == this.responseFormat)
                            { 
                                serializer = new JsonSerializer(this.requestDescription, stream, this.AbsoluteServiceUri, this.service, this.encoding, this.Host.ResponseETag);
                            } 
                            else if (ContentFormat.PlainXml == this.responseFormat) 
                            {
                                serializer = new PlainXmlSerializer(this.requestDescription, this.AbsoluteServiceUri, this.service, stream, this.encoding); 
                            }
                            else
                            {
                                Debug.Assert( 
#if ASTORIA_OPEN_OBJECT
                                    this.requestDescription.TargetKind == RequestTargetKind.OpenProperty || 
#endif 
                                    this.requestDescription.TargetKind == RequestTargetKind.Resource,
                                    "TargetKind " + this.requestDescription.TargetKind + " == Resource || OpenProperty -- POX should have handled it otherwise."); 
                                serializer = new SyndicationSerializer(
                                    this.requestDescription,
                                    this.AbsoluteServiceUri,
                                    this.service, 
                                    stream,
                                    this.encoding, 
                                    this.Host.ResponseETag, 
                                    new Atom10FormatterFactory());
                            } 

                            exceptionWriter = serializer;
                            Debug.Assert(exceptionWriter != null, "this.exceptionWriter != null");
                            serializer.WriteRequest(this.queryResults, this.hasMoved); 
                        }
 
                        break; 

                    default: 
                        Debug.Assert(
                            this.responseFormat == ContentFormat.MetadataDocument,
                            "responseFormat(" + this.responseFormat + ") == ContentFormat.MetadataDocument -- otherwise exception should have been thrown before");
                        Debug.Assert(this.requestDescription.TargetKind == RequestTargetKind.Metadata, "this.requestDescription.TargetKind == RequestTargetKind.Metadata"); 
                        MetadataSerializer metadataSerializer = new MetadataSerializer(stream, this.AbsoluteServiceUri, this.Provider, this.encoding);
                        exceptionWriter = metadataSerializer; 
                        metadataSerializer.WriteRequest(); 
                        break;
                } 
            }
            catch (Exception exception)
            {
                if (!WebUtil.IsCatchableExceptionType(exception)) 
                {
                    throw; 
                } 

                // Only JSON and XML are supported. 
                string contentType = (this.responseFormat == ContentFormat.Json) ? XmlConstants.MimeApplicationJson : XmlConstants.MimeApplicationXml;
                ErrorHandler.HandleDuringWritingException(exception, this.service, contentType, exceptionWriter);
            }
            finally 
            {
                WebUtil.Dispose(this.queryResults); 
            } 
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//  
//      Provides a base class for DataWeb services.
//  
// 
// @owner  [....]
//--------------------------------------------------------------------- 

namespace System.Data.Services
{
    using System; 
    using System.Collections;
    using System.Collections.Generic; 
    using System.Data.Objects; 
    using System.Diagnostics;
    using System.IO; 
    using System.ServiceModel;
    using System.ServiceModel.Channels;
    using System.Text;
    using System.Xml; 
    using System.Data.Services.Providers;
    using System.Data.Services.Serializers; 
 
    /// 
    /// Use this class to encapsulate writing the body of the outgoing response 
    /// for a data request.
    /// 
    internal class ResponseBodyWriter
    { 
        /// Encoding, if available.
        private readonly Encoding encoding; 
 
        /// Whether  has already moved.
        private readonly bool hasMoved; 

        /// Host for the request being processed.
        private readonly IDataService service;
 
        /// Enumerator for results.
        private readonly IEnumerator queryResults; 
 
        /// Description of request made to the system.
        private readonly RequestDescription requestDescription; 

        /// Content format for response.
        private readonly ContentFormat responseFormat;
 
        /// Initializes a new  that can write the body of a response.
        /// Encoding, if available. 
        /// Whether  has already moved. 
        /// Service for the request being processed.
        /// Enumerator for results. 
        /// Description of request made to the system.
        /// Content format for response.
        internal ResponseBodyWriter(
            Encoding encoding, 
            bool hasMoved,
            IDataService service, 
            IEnumerator queryResults, 
            RequestDescription requestDescription,
            ContentFormat responseFormat) 
        {
            Debug.Assert(responseFormat != ContentFormat.Unknown, "responseFormat != ContentFormat.Unknown");
            this.encoding = encoding;
            this.hasMoved = hasMoved; 
            this.service = service;
            this.queryResults = queryResults; 
            this.requestDescription = requestDescription; 
            this.responseFormat = responseFormat;
        } 

        /// Gets the absolute URI to the service.
        internal Uri AbsoluteServiceUri
        { 
            get { return this.service.RequestParams.AbsoluteServiceUri; }
        } 
 
        /// Gets the  for this response.
        internal IDataServiceHost Host 
        {
            get { return this.service.Host; }
        }
 
        /// Gets the  for this response.
        internal IDataServiceProvider Provider 
        { 
            get { return this.service.Provider; }
        } 

        /// Writes the request body to the specified .
        /// Stream to write to.
        internal void Write(Stream stream) 
        {
            Debug.Assert(stream != null, "stream != null"); 
            IExceptionWriter exceptionWriter = null; 
            try
            { 
                switch (this.responseFormat)
                {
                    case ContentFormat.Binary:
                        Debug.Assert( 
#if ASTORIA_OPEN_OBJECT
                            this.requestDescription.TargetKind == RequestTargetKind.OpenPropertyValue || 
#endif 
                            this.requestDescription.TargetKind == RequestTargetKind.PrimitiveValue,
                            this.requestDescription.TargetKind + " is PrimitiveValue or OpenPropertyValue"); 

                        BinarySerializer binarySerializer = new BinarySerializer(stream);
                        exceptionWriter = binarySerializer;
                        binarySerializer.WriteRequest(this.queryResults.Current); 
                        break;
 
                    case ContentFormat.Text: 
                        Debug.Assert(
#if ASTORIA_OPEN_OBJECT 
                            this.requestDescription.TargetKind == RequestTargetKind.OpenPropertyValue ||
#endif
                            this.requestDescription.TargetKind == RequestTargetKind.PrimitiveValue,
                            this.requestDescription.TargetKind + " is PrimitiveValue or OpenPropertyValue"); 

                        TextSerializer textSerializer = new TextSerializer(stream, this.encoding); 
                        exceptionWriter = textSerializer; 
                        textSerializer.WriteRequest(this.queryResults.Current);
                        break; 

                    case ContentFormat.Atom:
                    case ContentFormat.Json:
                    case ContentFormat.PlainXml: 
                        Debug.Assert(this.requestDescription.TargetKind != RequestTargetKind.PrimitiveValue, "this.requestDescription.TargetKind != RequestTargetKind.PrimitiveValue");
#if ASTORIA_OPEN_OBJECT 
                        Debug.Assert(this.requestDescription.TargetKind != RequestTargetKind.OpenPropertyValue, "this.requestDescription.TargetKind != RequestTargetKind.OpenPropertyValue"); 
#endif
                        Debug.Assert(this.requestDescription.TargetKind != RequestTargetKind.Metadata, "this.requestDescription.TargetKind != RequestTargetKind.Metadata"); 

                        if (this.requestDescription.TargetKind == RequestTargetKind.ServiceDirectory)
                        {
                            if (this.responseFormat == ContentFormat.Json) 
                            {
                                JsonServiceDocumentSerializer serviceSerializer = new JsonServiceDocumentSerializer(stream, this.Provider, this.encoding); 
                                exceptionWriter = serviceSerializer; 
                                serviceSerializer.WriteRequest();
                                break; 
                            }
                            else
                            {
                                AtomServiceDocumentSerializer serviceSerializer = new AtomServiceDocumentSerializer(stream, this.AbsoluteServiceUri, this.Provider, this.encoding); 
                                exceptionWriter = serviceSerializer;
                                serviceSerializer.WriteRequest(); 
                            } 
                        }
                        else 
                        {
                            Serializer serializer;
                            if (ContentFormat.Json == this.responseFormat)
                            { 
                                serializer = new JsonSerializer(this.requestDescription, stream, this.AbsoluteServiceUri, this.service, this.encoding, this.Host.ResponseETag);
                            } 
                            else if (ContentFormat.PlainXml == this.responseFormat) 
                            {
                                serializer = new PlainXmlSerializer(this.requestDescription, this.AbsoluteServiceUri, this.service, stream, this.encoding); 
                            }
                            else
                            {
                                Debug.Assert( 
#if ASTORIA_OPEN_OBJECT
                                    this.requestDescription.TargetKind == RequestTargetKind.OpenProperty || 
#endif 
                                    this.requestDescription.TargetKind == RequestTargetKind.Resource,
                                    "TargetKind " + this.requestDescription.TargetKind + " == Resource || OpenProperty -- POX should have handled it otherwise."); 
                                serializer = new SyndicationSerializer(
                                    this.requestDescription,
                                    this.AbsoluteServiceUri,
                                    this.service, 
                                    stream,
                                    this.encoding, 
                                    this.Host.ResponseETag, 
                                    new Atom10FormatterFactory());
                            } 

                            exceptionWriter = serializer;
                            Debug.Assert(exceptionWriter != null, "this.exceptionWriter != null");
                            serializer.WriteRequest(this.queryResults, this.hasMoved); 
                        }
 
                        break; 

                    default: 
                        Debug.Assert(
                            this.responseFormat == ContentFormat.MetadataDocument,
                            "responseFormat(" + this.responseFormat + ") == ContentFormat.MetadataDocument -- otherwise exception should have been thrown before");
                        Debug.Assert(this.requestDescription.TargetKind == RequestTargetKind.Metadata, "this.requestDescription.TargetKind == RequestTargetKind.Metadata"); 
                        MetadataSerializer metadataSerializer = new MetadataSerializer(stream, this.AbsoluteServiceUri, this.Provider, this.encoding);
                        exceptionWriter = metadataSerializer; 
                        metadataSerializer.WriteRequest(); 
                        break;
                } 
            }
            catch (Exception exception)
            {
                if (!WebUtil.IsCatchableExceptionType(exception)) 
                {
                    throw; 
                } 

                // Only JSON and XML are supported. 
                string contentType = (this.responseFormat == ContentFormat.Json) ? XmlConstants.MimeApplicationJson : XmlConstants.MimeApplicationXml;
                ErrorHandler.HandleDuringWritingException(exception, this.service, contentType, exceptionWriter);
            }
            finally 
            {
                WebUtil.Dispose(this.queryResults); 
            } 
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK