コード例 #1
0
        /// <summary>
        /// Writes the entity result to the response message.
        /// </summary>
        /// <param name="graph">The entity result to write.</param>
        /// <param name="type">The type of the entity.</param>
        /// <param name="messageWriter">The message writer.</param>
        /// <param name="writeContext">The writing context.</param>
        public override void WriteObject(
            object graph,
            Type type,
            ODataMessageWriter messageWriter,
            ODataSerializerContext writeContext)
        {
            PrimitiveResult primitiveResult = graph as PrimitiveResult;

            if (primitiveResult != null)
            {
                graph = primitiveResult.Result;
            }

            if (writeContext != null)
            {
                graph = ConvertToPayloadValue(writeContext.Model, graph);
            }

            base.WriteObject(graph, type, messageWriter, writeContext);
        }
コード例 #2
0
        private HttpResponseMessage CreateQueryResponse(IQueryable query, IEdmType edmType)
        {
            IEdmTypeReference typeReference = GetTypeReference(edmType);

            // TODO, GitHubIssue#328 : 404 should be returned when requesting property of non-exist entity
            BaseSingleResult    singleResult = null;
            HttpResponseMessage response     = null;

            if (typeReference.IsPrimitive())
            {
                if (this.shouldReturnCount || this.shouldWriteRawValue)
                {
                    var rawResult = new RawResult(query, typeReference, this.Api.Context);
                    singleResult = rawResult;
                    response     = this.Request.CreateResponse(HttpStatusCode.OK, rawResult);
                }
                else
                {
                    var primitiveResult = new PrimitiveResult(query, typeReference, this.Api.Context);
                    singleResult = primitiveResult;
                    response     = this.Request.CreateResponse(HttpStatusCode.OK, primitiveResult);
                }
            }

            if (typeReference.IsComplex())
            {
                var complexResult = new ComplexResult(query, typeReference, this.Api.Context);
                singleResult = complexResult;
                response     = this.Request.CreateResponse(HttpStatusCode.OK, complexResult);
            }

            if (typeReference.IsEnum())
            {
                if (this.shouldWriteRawValue)
                {
                    var rawResult = new RawResult(query, typeReference, this.Api.Context);
                    singleResult = rawResult;
                    response     = this.Request.CreateResponse(HttpStatusCode.OK, rawResult);
                }
                else
                {
                    var enumResult = new EnumResult(query, typeReference, this.Api.Context);
                    singleResult = enumResult;
                    response     = this.Request.CreateResponse(HttpStatusCode.OK, enumResult);
                }
            }

            if (singleResult != null)
            {
                if (singleResult.Result == null)
                {
                    // Per specification, If the property is single-valued and has the null value,
                    // the service responds with 204 No Content.
                    return(this.Request.CreateResponse(HttpStatusCode.NoContent));
                }

                return(response);
            }

            if (typeReference.IsCollection())
            {
                var elementType = typeReference.AsCollection().ElementType();
                if (elementType.IsPrimitive() || elementType.IsComplex() || elementType.IsEnum())
                {
                    return(this.Request.CreateResponse(
                               HttpStatusCode.OK, new NonEntityCollectionResult(query, typeReference, this.Api.Context)));
                }

                return(this.Request.CreateResponse(
                           HttpStatusCode.OK, new EntityCollectionResult(query, typeReference, this.Api.Context)));
            }

            var entityResult = new EntityResult(query, typeReference, this.Api.Context);

            if (entityResult.Result == null)
            {
                // TODO GitHubIssue#288: 204 expected when requesting single nav propery which has null value
                // ~/People(nonexistkey) and ~/People(nonexistkey)/BestFriend, expected 404
                // ~/People(key)/BestFriend, and BestFriend is null, expected 204
                throw new HttpResponseException(
                          this.Request.CreateErrorResponse(
                              HttpStatusCode.NotFound,
                              Resources.ResourceNotFound));
            }

            // TODO GitHubIssue#43 : support non-Entity ($select/$value) queries
            return(this.Request.CreateResponse(HttpStatusCode.OK, entityResult));
        }
コード例 #3
0
ファイル: RestierController.cs プロジェクト: aTiKhan/RESTier
        private IActionResult CreateQueryResponse(IQueryable query, IEdmType edmType, ETag etag)
        {
            var typeReference             = GetTypeReference(edmType);
            BaseSingleResult singleResult = null;
            IActionResult    response     = null;

            if (typeReference.IsPrimitive())
            {
                if (shouldReturnCount || shouldWriteRawValue)
                {
                    var rawResult = new RawResult(query, typeReference);
                    singleResult = rawResult;
                    response     = Ok(rawResult);
                }
                else
                {
                    var primitiveResult = new PrimitiveResult(query, typeReference);
                    singleResult = primitiveResult;
                    response     = Ok(primitiveResult);
                }
            }

            if (typeReference.IsComplex())
            {
                var complexResult = new ComplexResult(query, typeReference);
                singleResult = complexResult;
                response     = Ok(complexResult);
            }

            if (typeReference.IsEnum())
            {
                if (shouldWriteRawValue)
                {
                    var rawResult = new RawResult(query, typeReference);
                    singleResult = rawResult;
                    response     = Ok(rawResult);
                }
                else
                {
                    var enumResult = new EnumResult(query, typeReference);
                    singleResult = enumResult;
                    response     = Ok(enumResult);
                }
            }

            if (singleResult != null)
            {
                if (singleResult.Result == null)
                {
                    // Per specification, If the property is single-valued and has the null value,
                    // the service responds with 204 No Content.
                    return(NoContent());
                }

                return(response);
            }

            if (typeReference.IsCollection())
            {
                var elementType = typeReference.AsCollection().ElementType();
                if (elementType.IsPrimitive() || elementType.IsEnum())
                {
                    return(Ok(new NonResourceCollectionResult(query, typeReference)));
                }

                return(Ok(new ResourceSetResult(query, typeReference)));
            }

            var entityResult = query.SingleOrDefault();

            if (entityResult == null)
            {
                return(NoContent());
            }

            // Check the ETag here
            if (etag != null)
            {
                // request with If-Match header, if match, then should return whole content
                // request with If-Match header, if not match, then should return 412
                // request with If-None-Match header, if match, then should return 304
                // request with If-None-Match header, if not match, then should return whole content
                etag.EntityType = query.ElementType;
                query           = etag.ApplyTo(query);
                entityResult    = query.SingleOrDefault();
                if (entityResult == null && !etag.IsIfNoneMatch)
                {
                    return(StatusCode((int)HttpStatusCode.PreconditionFailed));
                }
                else if (entityResult == null)
                {
                    return(StatusCode((int)HttpStatusCode.NotModified));
                }
            }

            return(Ok(entityResult));
        }