/// <summary> /// Create ODataRequestMessage for the given entity. /// </summary> /// <param name="entityDescriptor">resource</param> /// <returns>An instance of ODataRequestMessage for the given entity.</returns> protected ODataRequestMessageWrapper CreateRequest(EntityDescriptor entityDescriptor) { Debug.Assert(null != entityDescriptor, "null entityDescriptor"); Debug.Assert(entityDescriptor.State == EntityStates.Added || entityDescriptor.State == EntityStates.Deleted || entityDescriptor.State == EntityStates.Modified, "the entity must be in one of the 3 possible states"); EntityStates state = entityDescriptor.State; Uri requestUri = entityDescriptor.GetResourceUri(this.RequestInfo.BaseUriResolver, false /*queryLink*/); Debug.Assert(null != requestUri, "request uri is null"); Debug.Assert(requestUri.IsAbsoluteUri, "request uri is not absolute uri"); ClientEdmModel model = this.RequestInfo.Model; ClientTypeAnnotation clientType = model.GetClientTypeAnnotation(model.GetOrCreateEdmType(entityDescriptor.Entity.GetType())); Version requestVersion = DetermineRequestVersion(clientType); string httpMethod = this.GetHttpMethod(state, ref requestVersion); HeaderCollection headers = new HeaderCollection(); // Set the content type if (EntityStates.Deleted != entityDescriptor.State) { this.RequestInfo.Context.Format.SetRequestContentTypeForEntry(headers); } // Set IfMatch (etag) header for update and delete requests if ((EntityStates.Deleted == state) || (EntityStates.Modified == state)) { string etag = entityDescriptor.GetLatestETag(); if (etag != null) { headers.SetHeader(XmlConstants.HttpRequestIfMatch, etag); } } // Set the prefer header if required ApplyPreferences(headers, httpMethod, this.RequestInfo.AddAndUpdateResponsePreference, ref requestVersion); // Set the request DSV and request MDSV headers headers.SetRequestVersion(requestVersion, this.RequestInfo.MaxProtocolVersionAsVersion); this.RequestInfo.Format.SetRequestAcceptHeader(headers); return this.CreateRequestMessage(httpMethod, requestUri, headers, this.RequestInfo.HttpStack, entityDescriptor, this.IsBatchRequest ? entityDescriptor.ChangeOrder.ToString(CultureInfo.InvariantCulture) : null); }
/// <summary> /// Materialize the response payload. /// </summary> /// <param name="entityDescriptor">entity descriptor whose response is getting materialized.</param> /// <param name="responseInfo">information about the response to be materialized.</param> /// <param name="etag">etag value, if specified in the response header.</param> private void MaterializeResponse(EntityDescriptor entityDescriptor, ResponseInfo responseInfo, string etag) { using (MaterializeAtom materializer = this.GetMaterializer(entityDescriptor, responseInfo)) { materializer.SetInsertingObject(entityDescriptor.Entity); object materializedEntity = null; foreach (object x in materializer) { Debug.Assert(materializedEntity == null, "entity == null"); if (materializedEntity != null) { Error.ThrowInternalError(InternalError.MaterializerReturningMoreThanOneEntity); } materializedEntity = x; } Debug.Assert(null != entityDescriptor.GetLatestIdentity(), "updated inserted should always gain an identity"); Debug.Assert(materializedEntity == entityDescriptor.Entity, "x == entityDescriptor.Entity, should have same object generated by response"); Debug.Assert(EntityStates.Unchanged == entityDescriptor.State, "should have moved out of insert"); Debug.Assert(this.RequestInfo.EntityTracker.TryGetEntityDescriptor(entityDescriptor.GetLatestIdentity()) != null, "should have identity tracked"); // If there was no etag specified in the payload, then we need to set the etag from the header if (entityDescriptor.GetLatestETag() == null) { entityDescriptor.ETag = etag; } } }