Ejemplo n.º 1
0
        public override async Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
        {
            if (type == typeof(IJsonApiDocument) && value == null)
            {
                return;
            }

            var contentHeaders    = content == null ? null : content.Headers;
            var effectiveEncoding = SelectCharacterEncoding(contentHeaders);
            var writer            = CreateJsonWriter(typeof(object), writeStream, effectiveEncoding);

            var singleResourceDocument     = value as ISingleResourceDocument;
            var resourceCollectionDocument = value as IResourceCollectionDocument;
            var errorDocument = value as IErrorDocument;

            if (singleResourceDocument != null)
            {
                await _singleResourceDocumentFormatter.Serialize(singleResourceDocument, writer);
            }
            else if (resourceCollectionDocument != null)
            {
                await _resourceCollectionDocumentFormatter.Serialize(resourceCollectionDocument, writer);
            }
            else if (errorDocument != null)
            {
                await _errorDocumentFormatter.Serialize(errorDocument, writer);
            }
            else
            {
                var error = value as HttpError;
                if (error != null)
                {
                    var httpErrorDocument = _errorDocumentBuilder.BuildFromHttpError(error, HttpStatusCode.InternalServerError);
                    await _errorDocumentFormatter.Serialize(httpErrorDocument, writer);
                }
                else
                {
                    WriteErrorForUnsupportedType(value, writer);
                }
            }

            writer.Flush();
        }
        public override async Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext,
                                                         CancellationToken cancellationToken)
        {
            var response = actionExecutedContext.Response;

            if (response != null && actionExecutedContext.Exception == null)
            {
                var content       = actionExecutedContext.Response.Content;
                var objectContent = content as ObjectContent;
                if (content != null && objectContent == null)
                {
                    return;
                }

                if (objectContent != null)
                {
                    if (objectContent.Value == null)
                    {
                        if (response.StatusCode == HttpStatusCode.OK)
                        {
                            response.StatusCode = HttpStatusCode.NoContent;
                        }
                        return;
                    }

                    // These document types should be passed through; they are already ready to be serialized.
                    if (objectContent.Value is ISingleResourceDocument ||
                        objectContent.Value is IResourceCollectionDocument)
                    {
                        return;
                    }

                    var errorDocument = objectContent.Value as IErrorDocument;
                    if (errorDocument != null)
                    {
                        actionExecutedContext.Response.StatusCode =
                            errorDocument.Errors.First().Status;
                        return;
                    }

                    object documentValue;
                    var    httpError = objectContent.Value as HttpError;
                    if (httpError != null)
                    {
                        documentValue = _errorDocumentBuilder.BuildFromHttpError(httpError, actionExecutedContext.Response.StatusCode);
                    }
                    else
                    {
                        documentValue =
                            await _fallbackDocumentBuilder.BuildDocument(objectContent.Value, actionExecutedContext.Request, cancellationToken);
                    }

                    errorDocument = documentValue as IErrorDocument;
                    if (documentValue is IErrorDocument)
                    {
                        actionExecutedContext.Response.StatusCode = errorDocument.Errors.First().Status;
                    }

                    actionExecutedContext.Response.Content = new ObjectContent(documentValue.GetType(), documentValue, objectContent.Formatter);
                }
            }

            await Task.Yield();
        }