/// <summary> /// Calculates the version based on the ODataUri provided /// </summary> /// <param name="request">Request to calculate from</param> /// <param name="maxProtocolVersion">Max Protocol version of the server</param> /// <returns>Data Service Protocol Version</returns> public DataServiceProtocolVersion CalculateMinRequestVersion(ODataRequest request, DataServiceProtocolVersion maxProtocolVersion) { ExceptionUtilities.CheckArgumentNotNull(request, "request"); ExceptionUtilities.Assert(maxProtocolVersion != DataServiceProtocolVersion.Unspecified, "Max protocol version cannot be unspecified when calculating the MinVersion"); string contentType = request.GetHeaderValueIfExists(HttpHeaders.ContentType); DataServiceProtocolVersion dataServiceVersion = VersionHelper.ConvertToDataServiceProtocolVersion(request.GetHeaderValueIfExists(HttpHeaders.DataServiceVersion)); DataServiceProtocolVersion maxDataServiceVersion = VersionHelper.ConvertToDataServiceProtocolVersion(request.GetHeaderValueIfExists(HttpHeaders.MaxDataServiceVersion)); HttpVerb effectiveVerb = request.GetEffectiveVerb(); if (contentType == null) { contentType = MimeTypes.Any; } // No real request payload for Delete so its automatically version 1 if (request.GetEffectiveVerb() == HttpVerb.Delete) { return(DataServiceProtocolVersion.V4); } if (effectiveVerb.IsUpdateVerb() || effectiveVerb == HttpVerb.Post) { EntitySet entitySet = null; if (request.Uri.TryGetExpectedEntitySet(out entitySet)) { // Determine if the operation and Uri combined yields something that we need to look at the metadata to determine the version or not bool processTypeMetadata = false; // Typically for all posts there is some type of payload so we should analyze the metadata if (effectiveVerb == HttpVerb.Post) { processTypeMetadata = true; } else if (dataServiceVersion != DataServiceProtocolVersion.Unspecified && request.PreferHeaderApplies(maxProtocolVersion)) { processTypeMetadata = true; } IEnumerable <EntityType> entityTypes = VersionHelper.GetEntityTypes(entitySet); // Whenever there is an update operation and EPM is involved we need to check the metadata version if (entityTypes.SelectMany(et => et.Annotations.OfType <PropertyMappingAnnotation>()).Where(fma => fma.KeepInContent == false).Any()) { processTypeMetadata = true; } if (processTypeMetadata) { return(VersionHelper.GetMaximumVersion(entityTypes.Select(et => et.CalculateEntityPropertyMappingProtocolVersion(VersionCalculationType.Request, contentType, maxProtocolVersion, maxDataServiceVersion)).ToArray())); } } return(DataServiceProtocolVersion.V4); } return(VersionHelper.CalculateUriMinRequestProtocolVersion(request.Uri, contentType, maxProtocolVersion, maxDataServiceVersion)); }