private OeEntityItem ReadEntityFromUrl(OeMessageContext context) { var parser = new ODataUriParser(context.Model, context.BaseUri, RequestUrl); ODataPath path = parser.ParsePath(); var keySegment = (KeySegment)path.LastSegment; var entityType = (IEdmEntityType)keySegment.EdmType; var entitySet = (IEdmEntitySet)keySegment.NavigationSource; var properties = new List <ODataProperty>(1); foreach (var key in keySegment.Keys) { properties.Add(new ODataProperty() { Name = key.Key, Value = key.Value }); } var entry = new ODataResource() { Properties = properties }; Db.OeEntitySetMetaAdapter entitySetMetaAdapter = context.EntitySetMetaAdapters.FindByEntitySetName(entitySet.Name); return(new OeEntityItem(entitySet, entityType, entitySetMetaAdapter.EntityType, entry)); }
private OeEntityItem ReadEntityFromStream(OeMessageContext context, Stream content) { var parser = new ODataUriParser(context.Model, context.BaseUri, RequestUrl); IEdmEntitySet entitySet; IEdmEntityTypeReference entityTypeRef = GetEdmEntityTypeRef(parser.ParsePath(), out entitySet); var entityType = (IEdmEntityType)entityTypeRef.Definition; ODataResource entry = null; IODataRequestMessage requestMessage = new OeInMemoryMessage(content, ContentType); var settings = new ODataMessageReaderSettings { EnableMessageStreamDisposal = false }; using (var messageReader = new ODataMessageReader(requestMessage, settings, context.Model)) { ODataReader reader = messageReader.CreateODataResourceReader(entitySet, entityType); while (reader.Read()) { if (reader.State == ODataReaderState.ResourceEnd) { entry = (ODataResource)reader.Item; } } if (entry == null) { throw new InvalidOperationException("operation not contain entry"); } } Db.OeEntitySetMetaAdapter entitySetMetaAdapter = context.EntitySetMetaAdapters.FindByEntitySetName(entitySet.Name); return(new OeEntityItem(entitySet, entityType, entitySetMetaAdapter.EntityType, entry)); }
public static OeOperationMessage Create(OeMessageContext context, ODataBatchReader reader) { ODataBatchOperationRequestMessage batchRequest = reader.CreateOperationRequestMessage(); var operation = new OeOperationMessage(batchRequest); if (batchRequest.Method == ODataConstants.MethodDelete) { operation.EntityItem = operation.ReadEntityFromUrl(context); } else { using (Stream stream = batchRequest.GetStream()) operation.EntityItem = operation.ReadEntityFromStream(context, stream); } return(operation); }
public async Task ExecuteAsync(Stream requestStream, Stream responseStream, String contentType, CancellationToken cancellationToken) { var context = new OeMessageContext(_baseUri, _model, _dataAdapter.EntitySetMetaAdapters); OeBatchMessage batchMessage = OeBatchMessage.CreateBatchMessage(context, requestStream, contentType); if (batchMessage.Changeset != null) { await ExecuteChangeset(batchMessage.Changeset, cancellationToken).ConfigureAwait(false); } else if (batchMessage.Operation != null) { await ExecuteOperation(batchMessage.Operation, cancellationToken).ConfigureAwait(false); } var batchWriter = new Writers.OeBatchWriter(context.BaseUri, context.Model); batchWriter.Write(responseStream, batchMessage); }
public static OeBatchMessage CreateBatchMessage(OeMessageContext context, Stream requestStream, String contentType) { IODataRequestMessage requestMessage = new OeInMemoryMessage(requestStream, contentType); var settings = new ODataMessageReaderSettings() { EnableMessageStreamDisposal = false }; using (var messageReader = new ODataMessageReader(requestMessage, settings)) { var batchMessage = new List <OeBatchMessage>(); ODataBatchReader batchReader = messageReader.CreateODataBatchReader(); while (batchReader.Read()) { if (batchReader.State == ODataBatchReaderState.ChangesetStart) { var operations = new List <OeOperationMessage>(); while (batchReader.Read() && batchReader.State != ODataBatchReaderState.ChangesetEnd) { if (batchReader.State == ODataBatchReaderState.Operation) { OeOperationMessage operation = OeOperationMessage.Create(context, batchReader); operations.Add(operation); } } return(new OeBatchMessage(contentType, operations)); } else if (batchReader.State == ODataBatchReaderState.Operation) { OeOperationMessage operation = OeOperationMessage.Create(context, batchReader); return(new OeBatchMessage(contentType, operation)); } } } throw new InvalidOperationException("batch not found"); }
protected virtual async Task BatchCore() { var actionDescriptors = GetService <IActionDescriptorCollectionProvider>().ActionDescriptors; var actionInvokerFactory = GetService <IActionInvokerFactory>(); String[] apiSegments = base.HttpContext.Request.Path.Value.Split(new[] { '/' }, 2, StringSplitOptions.RemoveEmptyEntries); Uri baseUri = UriHelper.GetBaseUri(base.Request); var messageContext = new OeMessageContext(baseUri, EdmModel, DataAdapter.EntitySetMetaAdapters); OeBatchMessage batchMessage = OeBatchMessage.CreateBatchMessage(messageContext, base.HttpContext.Request.Body, base.HttpContext.Request.ContentType); Object dataContext = null; try { dataContext = DataAdapter.CreateDataContext(); foreach (OeOperationMessage operation in batchMessage.Changeset) { OeEntitySetAdapter entitySetAdapter = DataAdapter.GetEntitySetAdapter(operation.EntityItem.EntitySet.Name); var segments = new String[apiSegments.Length]; Array.Copy(apiSegments, segments, 1); segments[apiSegments.Length - 1] = entitySetAdapter.EntitySetMetaAdapter.EntitySetName; var candidates = OeRouter.SelectCandidates(actionDescriptors.Items, segments, operation.Method); if (candidates.Count > 1) { throw new AmbiguousActionException(String.Join(Environment.NewLine, candidates.Select(c => c.DisplayName))); } if (candidates.Count == 0) { throw new InvalidOperationException("Action " + operation.Method + " for controller " + segments.Last() + " not found"); } var modelState = new OeFilterAttribute.BatchModelStateDictionary() { Entity = operation.EntityItem.Entity, DataContext = new OeDataContext(ref entitySetAdapter, dataContext, operation) }; OnBeforeInvokeController(modelState.DataContext, operation.EntityItem); var actionContext = new ActionContext(base.HttpContext, base.HttpContext.GetRouteData(), candidates[0], modelState); IActionInvoker actionInvoker = actionInvokerFactory.CreateInvoker(actionContext); await actionInvoker.InvokeAsync(); } await SaveChangesAsync(dataContext).ConfigureAwait(false); } finally { if (dataContext != null) { DataAdapter.CloseDataContext(dataContext); } } base.HttpContext.Response.ContentType = base.HttpContext.Request.ContentType; var batchWriter = new OeBatchWriter(baseUri, EdmModel); batchWriter.Write(base.HttpContext.Response.Body, batchMessage); }