Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Server / System / Data / Services / ResponseBodyWriter.cs / 1305376 / 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.Data.Services.Providers; using System.Data.Services.Serializers; using System.Diagnostics; using System.IO; using System.Text; ////// 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 private readonly bool hasMoved; ///has already moved. 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; ///If the target is a Media Resource, this holds the read stream for the Media Resource. private Stream mediaResourceStream; ///Initializes a new /// Encoding, if available. /// Whetherthat can write the body of a response. 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; if (this.requestDescription.TargetKind == RequestTargetKind.MediaResource) { // Note that GetReadStream will set the ResponseETag before it returns this.mediaResourceStream = service.StreamProvider.GetReadStream(this.queryResults.Current, this.service.OperationContext); } } /// Gets the absolute URI to the service. internal Uri AbsoluteServiceUri { get { return this.service.OperationContext.AbsoluteServiceUri; } } ///Gets the internal DataServiceHostWrapper Host { get { return this.service.OperationContext.Host; } } ///for this response. Gets the internal DataServiceProviderWrapper Provider { get { return this.service.Provider; } } ///for this response. 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( this.requestDescription.TargetKind == RequestTargetKind.OpenPropertyValue || this.requestDescription.TargetKind == RequestTargetKind.PrimitiveValue || this.requestDescription.TargetKind == RequestTargetKind.MediaResource, this.requestDescription.TargetKind + " is PrimitiveValue or OpenPropertyValue or StreamPropertyValue"); BinarySerializer binarySerializer = new BinarySerializer(stream); exceptionWriter = binarySerializer; if (this.requestDescription.TargetKind == RequestTargetKind.MediaResource) { Debug.Assert(this.mediaResourceStream != null, "this.mediaResourceStream != null"); binarySerializer.WriteRequest(this.mediaResourceStream, this.service.StreamProvider.StreamBufferSize); } else { binarySerializer.WriteRequest(this.queryResults.Current); } break; case ContentFormat.Text: Debug.Assert( this.requestDescription.TargetKind == RequestTargetKind.OpenPropertyValue || 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"); Debug.Assert(this.requestDescription.TargetKind != RequestTargetKind.OpenPropertyValue, "this.requestDescription.TargetKind != RequestTargetKind.OpenPropertyValue"); 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(this.service); } } 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( this.requestDescription.TargetKind == RequestTargetKind.OpenProperty || 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(this.service); 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); WebUtil.Dispose(this.mediaResourceStream); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007..
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DisplayMemberTemplateSelector.cs
- SqlGenerator.cs
- InvokeDelegate.cs
- SqlClientPermission.cs
- SwitchElementsCollection.cs
- CorePropertiesFilter.cs
- RuntimeCompatibilityAttribute.cs
- MatrixStack.cs
- DeleteCardRequest.cs
- AuthenticationException.cs
- MetadataPropertyvalue.cs
- Transform3D.cs
- ReadOnlyPropertyMetadata.cs
- WebMessageEncodingBindingElement.cs
- ValidatorCompatibilityHelper.cs
- QueryStoreStatusRequest.cs
- ComplexObject.cs
- TextEditorLists.cs
- RtfFormatStack.cs
- Page.cs
- DataServiceHostWrapper.cs
- HtmlGenericControl.cs
- FixedTextPointer.cs
- XmlWriter.cs
- CompoundFileDeflateTransform.cs
- SimpleMailWebEventProvider.cs
- LostFocusEventManager.cs
- ExceptionUtil.cs
- VectorKeyFrameCollection.cs
- SynchronizedInputAdaptor.cs
- ViewRendering.cs
- CompilerGeneratedAttribute.cs
- NativeRecognizer.cs
- ControlAdapter.cs
- CookieProtection.cs
- HttpListener.cs
- CacheChildrenQuery.cs
- PolyLineSegment.cs
- WindowsAuthenticationModule.cs
- SendActivityDesignerTheme.cs
- StringHandle.cs
- TemplatedAdorner.cs
- MetafileHeaderWmf.cs
- RootNamespaceAttribute.cs
- TextRenderer.cs
- Style.cs
- OLEDB_Enum.cs
- DoubleStorage.cs
- WorkflowInvoker.cs
- XmlSchemaAnnotated.cs
- AttachedAnnotationChangedEventArgs.cs
- CodeMemberEvent.cs
- RepeatBehaviorConverter.cs
- ApplicationProxyInternal.cs
- OpenTypeLayout.cs
- ExtensionSurface.cs
- BitSet.cs
- Vector3DCollectionConverter.cs
- ToolStripDropDownMenu.cs
- FormViewCommandEventArgs.cs
- ResourcePart.cs
- HttpProxyTransportBindingElement.cs
- ControlTemplate.cs
- DropShadowBitmapEffect.cs
- GeneralTransform.cs
- TdsParserHelperClasses.cs
- _SingleItemRequestCache.cs
- SwitchLevelAttribute.cs
- InputLanguageEventArgs.cs
- AssociationTypeEmitter.cs
- EditorPartChrome.cs
- XhtmlTextWriter.cs
- JsonFormatReaderGenerator.cs
- BooleanAnimationUsingKeyFrames.cs
- DbUpdateCommandTree.cs
- CalendarModeChangedEventArgs.cs
- ClientSideQueueItem.cs
- EncryptedKey.cs
- XmlSignificantWhitespace.cs
- ConfigXmlDocument.cs
- StrokeNode.cs
- HttpHandlersSection.cs
- FunctionMappingTranslator.cs
- PolicyManager.cs
- EventPropertyMap.cs
- XmlSignatureManifest.cs
- GradientStop.cs
- UpdatableWrapper.cs
- InternalConfigRoot.cs
- UrlMappingCollection.cs
- TypeConverterHelper.cs
- RawStylusInputCustomDataList.cs
- MembershipValidatePasswordEventArgs.cs
- DataConnectionHelper.cs
- WorkerRequest.cs
- DuplicateDetector.cs
- TCPListener.cs
- FieldCollectionEditor.cs
- Bidi.cs
- IgnorePropertiesAttribute.cs