public virtual async Task <Guid> CreateAsync(Entity entity) { if (entity is null) { throw new ArgumentNullException(nameof(entity)); } var collectionName = WebApiMetadata.GetEntitySetName(entity.LogicalName); var json = JsonConvert.SerializeObject(entity, SerializerSettings); using var httpRequest = new HttpRequestMessage(HttpMethod.Post, $"{collectionName}") { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json") }; using var httpResponse = await SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead, default) .ConfigureAwait(false); httpRequest.Dispose(); Guid entityId = default; if (httpResponse.StatusCode == System.Net.HttpStatusCode.NoContent) { if (httpResponse.Headers.TryGetValues("OData-EntityId", out var headersRaw)) { var headers = headersRaw as string[] ?? headersRaw.ToArray(); var rawValue = headers.First().Split("(").Last().Split(")").First(); if (!Guid.TryParse(rawValue, out entityId)) { throw new WebApiException( $"Error parsing response header 'OData-EntityId'. Value: {headers.First()}"); } } else { throw new WebApiException("Response header 'OData-EntityId' not present."); } } else { ODataResponseReader.EnsureSuccessStatusCode(httpResponse, _logger); } return(entityId); }
public virtual async Task <Guid> CreateAsync(Entity entity) { if (entity is null) { throw new ArgumentNullException(nameof(entity)); } if (string.IsNullOrEmpty(entity.LogicalName)) { throw new ArgumentException("Entity Logical name cannot be empty."); } var watch = Stopwatch.StartNew(); _logger.LogDebug("Starting {WebApiOperationName} {TargetEntity}", "CREATE", entity.LogicalName); var collectionName = WebApiMetadata.GetEntitySetName(entity.LogicalName); var json = JsonConvert.SerializeObject(entity, SerializerSettings); using var httpRequest = new HttpRequestMessage(HttpMethod.Post, $"{collectionName}") { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json") }; using var httpResponse = await SendAsync(httpRequest, HttpCompletionOption.ResponseHeadersRead, default) .ConfigureAwait(false); httpRequest.Dispose(); Guid entityId = default; if (httpResponse.StatusCode == System.Net.HttpStatusCode.NoContent) { if (httpResponse.Headers.TryGetValues("OData-EntityId", out var headersRaw)) { var headers = headersRaw as string[] ?? headersRaw.ToArray(); var rawValue = headers.First().Split("(").Last().Split(")").First(); if (!Guid.TryParse(rawValue, out entityId)) { throw new WebApiException( $"Error parsing response header 'OData-EntityId'. Value: {headers.First()}"); } } else { _logger.LogError("Response header 'OData-EntityId' not present."); throw new WebApiException("Response header 'OData-EntityId' not present."); } } else { ODataResponseReader.EnsureSuccessStatusCode(httpResponse, _logger); } watch.Stop(); _logger.LogInformation("Complete {WebApiOperationName} {TargetEntity} in {Elapsed:0.0}ms - {EntityId}", "CREATE", entity.LogicalName, watch.Elapsed.TotalMilliseconds, entityId); return(entityId); }