private byte[] ClientWriteBatchRequest(BodyContentType bodyContentType) { MemoryStream stream = new MemoryStream(); IODataRequestMessage requestMessage = new InMemoryMessage { Stream = stream }; requestMessage.SetHeader(ODataConstants.ContentTypeHeader, batchContentTypeApplicationJson); using (ODataMessageWriter messageWriter = new ODataMessageWriter(requestMessage)) { ODataBatchWriter batchWriter = messageWriter.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); // Write a change set with update operation. batchWriter.WriteStartChangeset(); // Create an update operation in the change set. ODataBatchOperationRequestMessage updateOperationMessage = batchWriter.CreateOperationRequestMessage( "PUT", new Uri(serviceDocumentUri + "MyBlob"), "1"); // Set the content type with explicit character set so that the content string // is flushed into the operation message body stream without byte-order-mark. updateOperationMessage.SetHeader("CoNtEnt-TYPE", GetContentType(bodyContentType)); // Use the message writer to write encoded string content. using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(updateOperationMessage)) { operationMessageWriter.WriteValue(GetEncodedContentObject(bodyContentType, /*forRequest*/ true)); } batchWriter.WriteEndChangeset(); // Write a query operation. ODataBatchOperationRequestMessage queryOperationMessage = batchWriter.CreateOperationRequestMessage( "GET", new Uri(serviceDocumentUri + "MyBlob"), /*contentId*/ null); // Header modification on inner payload. queryOperationMessage.SetHeader("AcCePt", GetContentType(bodyContentType)); batchWriter.WriteEndBatch(); stream.Position = 0; return(stream.ToArray()); } }
/// <summary> /// Create a request message for a batch part from the batch writer. This method copies request headers /// from <paramref name="requestMessageArgs"/> in addition to the method and Uri. /// </summary> /// <param name="batchWriter">ODataBatchWriter instance to build operation message from.</param> /// <param name="requestMessageArgs">RequestMessageArgs for the request.</param> /// <param name="requestInfo">RequestInfo instance.</param> /// <param name="contentId">The Content-ID value to write in ChangeSet head.</param> /// <param name="isRelativeUri">If the request is using a relative uri.</param> /// <returns>an instance of ODataRequestMessageWrapper.</returns> internal static ODataRequestMessageWrapper CreateBatchPartRequestMessage( ODataBatchWriter batchWriter, BuildingRequestEventArgs requestMessageArgs, RequestInfo requestInfo, string contentId, bool isRelativeUri) { IODataRequestMessage requestMessage; requestMessage = batchWriter.CreateOperationRequestMessage( requestMessageArgs.Method, requestMessageArgs.RequestUri, contentId, isRelativeUri ? BatchPayloadUriOption.RelativeUri : BatchPayloadUriOption.AbsoluteUri); foreach (var h in requestMessageArgs.Headers) { requestMessage.SetHeader(h.Key, h.Value); } var clientRequestMessage = new InternalODataRequestMessage(requestMessage, false /*allowGetStream*/); ODataRequestMessageWrapper messageWrapper = new InnerBatchRequestMessageWrapper(clientRequestMessage, requestMessage, requestInfo, requestMessageArgs.Descriptor); return(messageWrapper); }
private void createDeleteOperationRequestMessage(ref ODataBatchWriter writer, Change change, string tableName) { string id = this.getKeyType(tableName).IsString() ? "'" + change.id + "'" : change.id; Uri uri = new Uri(tableName + "(" + id + ")", UriKind.Relative); writer.CreateOperationRequestMessage("DELETE", uri); }
#pragma warning disable 1998 private async Task <ODataBatchOperationRequestMessage> CreateBatchOperationMessageAsync( Uri uri, string method, string collection, string contentId, bool resultRequired) { #if SILVERLIGHT var message = _batchWriter.CreateOperationRequestMessage(method, uri); #else var message = await _batchWriter.CreateOperationRequestMessageAsync(method, uri); #endif if (method != RestVerbs.Get && method != RestVerbs.Delete) { message.SetHeader(HttpLiteral.ContentId, contentId); } if (method == RestVerbs.Post || method == RestVerbs.Put || method == RestVerbs.Patch) { message.SetHeader(HttpLiteral.Prefer, resultRequired ? HttpLiteral.ReturnContent : HttpLiteral.ReturnNoContent); } if (collection != null && _session.Metadata.EntityCollectionRequiresOptimisticConcurrencyCheck(collection) && (method == RestVerbs.Put || method == RestVerbs.Patch || method == RestVerbs.Delete)) { message.SetHeader(HttpLiteral.IfMatch, EntityTagHeaderValue.Any.Tag); } return(message); }
internal static ODataRequestMessageWrapper CreateBatchPartRequestMessage(ODataBatchWriter batchWriter, string method, Uri requestUrl, RequestInfo requestInfo) { return(new ODataRequestMessageWrapper(batchWriter.CreateOperationRequestMessage(method, requestUrl), requestInfo) { IsBatchPartRequest = true }); }
private void createInsertOperationRequestMessage(ref ODataBatchWriter writer, Change change, string tableName, string[] headers) { Uri uri = new Uri(tableName, UriKind.Relative); var updateOperaitonMessage = writer.CreateOperationRequestMessage("POST", uri); updateOperaitonMessage.SetHeader("Content-Type", "application/json"); using (var operationMessageWriter = new ODataMessageWriter(updateOperaitonMessage)) { var entityWriter = operationMessageWriter.CreateODataEntryWriter(); var entry = new ODataEntry() { Properties = createOperationProperties(change.data, tableName, headers), TypeName = this.GetEntityTypeName(tableName) }; entityWriter.WriteStart(entry); entityWriter.WriteEnd(); } }
/// <summary> /// Create a request message for a batch part from the batch writer. This method copies request headers /// from <paramref name="requestMessageArgs"/> in addition to the method and Uri. /// </summary> /// <param name="batchWriter">ODataBatchWriter instance to build operation message from.</param> /// <param name="requestMessageArgs">RequestMessageArgs for the request.</param> /// <param name="requestInfo">RequestInfo instance.</param> /// <returns>an instance of ODataRequestMessageWrapper.</returns> internal static ODataRequestMessageWrapper CreateBatchPartRequestMessage( ODataBatchWriter batchWriter, BuildingRequestEventArgs requestMessageArgs, RequestInfo requestInfo) { IODataRequestMessage requestMessage = batchWriter.CreateOperationRequestMessage(requestMessageArgs.Method, requestMessageArgs.RequestUri); #if WINDOWS_PHONE if (requestInfo.HasWritingRequestEventHandlers) { // We use the InternalODataRequestMessage constructor here beecause we want to allow the user to be able to access the underlying request stream. requestMessage = new InternalODataRequestMessage(requestMessage, true); } #endif foreach (var h in requestMessageArgs.Headers) { requestMessage.SetHeader(h.Key, h.Value); } var clientRequestMessage = new InternalODataRequestMessage(requestMessage, false /*allowGetStream*/); ODataRequestMessageWrapper messageWrapper = new InnerBatchRequestMessageWrapper(clientRequestMessage, requestMessage, requestInfo, requestMessageArgs.Descriptor); return(messageWrapper); }
internal static Tuple <HttpWebRequest, Stream> BuildRequestForTableBatchOperation(Uri uri, UriQueryBuilder builder, IBufferManager bufferManager, int?timeout, string tableName, TableBatchOperation batch, bool useVersionHeader, OperationContext ctx, TableRequestOptions options, string accountName) { HttpWebRequest msg = BuildRequestCore(NavigationHelper.AppendPathToSingleUri(uri, "$batch"), builder, "POST", timeout, useVersionHeader, ctx); TablePayloadFormat payloadFormat = options.PayloadFormat.Value; Logger.LogInformational(ctx, SR.PayloadFormat, payloadFormat); // create the writer, indent for readability of the examples. ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings() { CheckCharacters = false, // sets this flag on the XmlWriter for ATOM Version = TableConstants.ODataProtocolVersion // set the Odata version to use when writing the entry }; HttpWebRequestAdapterMessage adapterMsg = new HttpWebRequestAdapterMessage(msg, bufferManager); // Start Batch ODataMessageWriter odataWriter = new ODataMessageWriter(adapterMsg, writerSettings); ODataBatchWriter batchWriter = odataWriter.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); bool isQuery = batch.Count == 1 && batch[0].OperationType == TableOperationType.Retrieve; // Query operations should not be inside changeset in payload if (!isQuery) { // Start Operation batchWriter.WriteStartChangeset(); batchWriter.Flush(); } foreach (TableOperation operation in batch) { string httpMethod = operation.HttpMethod; if (operation.OperationType == TableOperationType.Merge || operation.OperationType == TableOperationType.InsertOrMerge) { options.AssertNoEncryptionPolicyOrStrictMode(); httpMethod = "MERGE"; } ODataBatchOperationRequestMessage mimePartMsg = batchWriter.CreateOperationRequestMessage(httpMethod, operation.GenerateRequestURI(uri, tableName)); SetAcceptAndContentTypeForODataBatchMessage(mimePartMsg, payloadFormat); // etag if (operation.OperationType == TableOperationType.Delete || operation.OperationType == TableOperationType.Replace || operation.OperationType == TableOperationType.Merge) { mimePartMsg.SetHeader("If-Match", operation.Entity.ETag); } // Prefer header if (operation.OperationType == TableOperationType.Insert) { mimePartMsg.SetHeader("Prefer", operation.EchoContent ? "return-content" : "return-no-content"); } if (operation.OperationType != TableOperationType.Delete && operation.OperationType != TableOperationType.Retrieve) { using (ODataMessageWriter batchEntryWriter = new ODataMessageWriter(mimePartMsg, writerSettings, new TableStorageModel(accountName))) { // Write entity ODataWriter entryWriter = batchEntryWriter.CreateODataEntryWriter(); WriteOdataEntity(operation.Entity, operation.OperationType, ctx, entryWriter, options); } } } if (!isQuery) { // End Operation batchWriter.WriteEndChangeset(); } // End Batch batchWriter.WriteEndBatch(); batchWriter.Flush(); return(new Tuple <HttpWebRequest, Stream>(adapterMsg.GetPopulatedMessage(), adapterMsg.GetStream())); }
internal static StorageRequestMessage BuildRequestForTableBatchOperation <T>(RESTCommand <T> cmd, Uri uri, UriQueryBuilder builder, int?timeout, string tableName, TableBatchOperation batch, CloudTableClient client, HttpContent content, OperationContext ctx, TablePayloadFormat payloadFormat, ICanonicalizer canonicalizer, StorageCredentials credentials) { StorageRequestMessage msg = BuildRequestCore(NavigationHelper.AppendPathToSingleUri(uri, "$batch"), builder, HttpMethod.Post, timeout, content, ctx, canonicalizer, credentials); Logger.LogInformational(ctx, SR.PayloadFormat, payloadFormat); // create the writer, indent for readability of the examples. ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings() { CheckCharacters = false, // sets this flag on the XmlWriter for ATOM Version = TableConstants.ODataProtocolVersion // set the Odata version to use when writing the entry }; HttpRequestAdapterMessage adapterMsg = new HttpRequestAdapterMessage(msg, client.BufferManager, 64 * (int)Constants.KB); cmd.StreamToDispose = adapterMsg.GetStream(); // Start Batch ODataMessageWriter odataWriter = new ODataMessageWriter(adapterMsg, writerSettings); ODataBatchWriter batchWriter = odataWriter.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); bool isQuery = batch.Count == 1 && batch[0].OperationType == TableOperationType.Retrieve; // Query operations should not be inside changeset in payload if (!isQuery) { // Start Operation batchWriter.WriteStartChangeset(); batchWriter.Flush(); } foreach (TableOperation operation in batch) { string httpMethod = operation.OperationType == TableOperationType.Merge || operation.OperationType == TableOperationType.InsertOrMerge ? "MERGE" : operation.HttpMethod.Method; ODataBatchOperationRequestMessage mimePartMsg = batchWriter.CreateOperationRequestMessage(httpMethod, operation.GenerateRequestURI(uri, tableName)); SetAcceptAndContentTypeForODataBatchMessage(mimePartMsg, payloadFormat); // etag if (operation.OperationType == TableOperationType.Delete || operation.OperationType == TableOperationType.Replace || operation.OperationType == TableOperationType.Merge) { mimePartMsg.SetHeader("If-Match", operation.Entity.ETag); } // Prefer header if (operation.OperationType == TableOperationType.Insert) { mimePartMsg.SetHeader("Prefer", operation.EchoContent ? "return-content" : "return-no-content"); } if (operation.OperationType != TableOperationType.Delete && operation.OperationType != TableOperationType.Retrieve) { using (ODataMessageWriter batchEntryWriter = new ODataMessageWriter(mimePartMsg, writerSettings, new TableStorageModel(client.AccountName))) { // Write entity ODataWriter entryWriter = batchEntryWriter.CreateODataEntryWriter(); WriteOdataEntity(operation.Entity, operation.OperationType, ctx, entryWriter); } } } if (!isQuery) { // End Operation batchWriter.WriteEndChangeset(); } // End Batch batchWriter.WriteEndBatch(); batchWriter.Flush(); return(adapterMsg.GetPopulatedMessage()); }
private byte[] CreateBigBatchRequest(int repeatCount) { MemoryStream stream = new MemoryStream(); IODataRequestMessage requestMessage = new InMemoryMessage { Stream = stream }; requestMessage.SetHeader("Content-Type", batchContentTypeApplicationJson); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.BaseUri = new Uri(serviceDocumentUri); using (ODataMessageWriter messageWriter = new ODataMessageWriter(requestMessage, settings)) { ODataBatchWriter batchWriter = messageWriter.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); // Each iteration generates a change set with two operations, followed by one top level operation. // Operations count in each iteration is three. for (int idx = 0; idx < repeatCount * 3; idx += 3) { batchWriter.WriteStartChangeset(); ODataBatchOperationRequestMessage createOperationMessage = batchWriter.CreateOperationRequestMessage( "PUT", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "MySingleton")), idx.ToString()); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(createOperationMessage)) { ODataWriter entryWriter = operationMessageWriter.CreateODataResourceWriter(); ODataResource entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = "webid_" + idx }, new ODataProperty() { Name = "Name", Value = this.aVeryLongString } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } // A PATCH operation that depends on the preceding PUT operation. List <string> dependsOnIds = new List <string> { idx.ToString() }; ODataBatchOperationRequestMessage updateOperationMessage = batchWriter.CreateOperationRequestMessage( "PATCH", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "$" + idx)), (idx + 1).ToString(), BatchPayloadUriOption.AbsoluteUri, dependsOnIds); // Verify that input values are copied into a new list. Assert.Equal(dependsOnIds, updateOperationMessage.DependsOnIds); Assert.NotSame(dependsOnIds, updateOperationMessage.DependsOnIds); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(updateOperationMessage)) { var entryWriter = operationMessageWriter.CreateODataResourceWriter(); var entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = "webid_" + (idx + 1) } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } Assert.Equal(createOperationMessage.GroupId, updateOperationMessage.GroupId); batchWriter.WriteEndChangeset(); ODataBatchOperationRequestMessage queryOperationMessage = batchWriter.CreateOperationRequestMessage( "GET", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "MySingleton")), (idx + 2).ToString()); queryOperationMessage.SetHeader("Accept", "application/json;odata.metadata=full"); } batchWriter.WriteEndBatch(); stream.Position = 0; return(stream.ToArray()); } }
/// <summary> /// Create a batch request that contains one atomic groups. /// </summary> /// <param name="atomicGroupIdFromRequest">Output string for the atomic group id from the batch created.</param> /// <returns>Stream containing the batch request.</returns> private byte[] CreateBatchRequestWithAtomicGroup(out string atomicGroupIdFromRequest) { MemoryStream stream = new MemoryStream(); IODataRequestMessage requestMessage = new InMemoryMessage { Stream = stream }; requestMessage.SetHeader("Content-Type", batchContentTypeApplicationJson); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.BaseUri = new Uri(serviceDocumentUri); using (ODataMessageWriter messageWriter = new ODataMessageWriter(requestMessage, settings)) { ODataBatchWriter batchWriter = messageWriter.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); batchWriter.WriteStartChangeset(); // Create operation. ODataBatchOperationRequestMessage createOperationMessage = batchWriter.CreateOperationRequestMessage( "PUT", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "MySingleton")), "1"); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(createOperationMessage)) { ODataWriter entryWriter = operationMessageWriter.CreateODataResourceWriter(); ODataResource entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = 10 }, new ODataProperty() { Name = "Name", Value = "SingletonWebForBatchJsonLightAtomicGroupIdTest" } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } // A PATCH operation that depends on the preceding PUT operation. List <string> dependsOnIds = new List <string> { "1" }; ODataBatchOperationRequestMessage updateOperationMessage = batchWriter.CreateOperationRequestMessage( "PATCH", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "$1")), "2", BatchPayloadUriOption.AbsoluteUri, dependsOnIds); // Verify that input values are copied into a new list. Assert.Equal(dependsOnIds, updateOperationMessage.DependsOnIds); Assert.NotSame(dependsOnIds, updateOperationMessage.DependsOnIds); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(updateOperationMessage)) { var entryWriter = operationMessageWriter.CreateODataResourceWriter(); var entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = 11 } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } Assert.Equal(createOperationMessage.GroupId, updateOperationMessage.GroupId); batchWriter.WriteEndChangeset(); ODataBatchOperationRequestMessage update2OperationMessage = batchWriter.CreateOperationRequestMessage( "PATCH", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "MySingleton")), "3", BatchPayloadUriOption.AbsoluteUri); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(update2OperationMessage)) { var entryWriter = operationMessageWriter.CreateODataResourceWriter(); var entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = 12 } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } batchWriter.WriteEndBatch(); atomicGroupIdFromRequest = createOperationMessage.GroupId; stream.Position = 0; return(stream.ToArray()); } }
/// <summary> /// Create a batch request that contains atomic groups. /// </summary> /// <param name="atomicGroupIdFromRequest">Output string for the first atomic group id from the batch created.</param> /// <param name="atomicGroupAIdFromRequest">Output string for the second atomic group id from the batch created.</param> /// <returns>Stream containing the batch request.</returns> private byte[] CreateBatchRequestWithMultipleAtomicGroups( out string atomicGroupIdFromRequest, out string atomicGroupAIdFromRequest) { MemoryStream stream = new MemoryStream(); IODataRequestMessage requestMessage = new InMemoryMessage { Stream = stream }; requestMessage.SetHeader("Content-Type", batchContentTypeApplicationJson); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.BaseUri = new Uri(serviceDocumentUri); using (ODataMessageWriter messageWriter = new ODataMessageWriter(requestMessage, settings)) { ODataBatchWriter batchWriter = messageWriter.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); // Lexical scope for first half: query ("3"), create("1"), patch("2") { // Query operation ODataBatchOperationRequestMessage queryOperationMessage = batchWriter.CreateOperationRequestMessage("GET", new Uri(serviceDocumentUri + "MySingleton"), "3"); queryOperationMessage.SetHeader("Accept", "application/json;odata.metadata=full"); batchWriter.WriteStartChangeset(); // Create operation. ODataBatchOperationRequestMessage createOperationMessage = batchWriter.CreateOperationRequestMessage ( "PUT", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "MySingleton")), "1"); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(createOperationMessage)) { ODataWriter entryWriter = operationMessageWriter.CreateODataResourceWriter(); ODataResource entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = 10 }, new ODataProperty() { Name = "Name", Value = "SingletonWebForBatchJsonLightAtomicGroupIdTest" } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } // A PATCH operation that depends on the preceding PUT operation. string[] dependsOnIds = new string[] { "1" }; ODataBatchOperationRequestMessage updateOperationMessage = batchWriter.CreateOperationRequestMessage ( "PATCH", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "$1")), "2", BatchPayloadUriOption.AbsoluteUri, dependsOnIds); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(updateOperationMessage)) { var entryWriter = operationMessageWriter.CreateODataResourceWriter(); var entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = 11 } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } Assert.Equal(createOperationMessage.GroupId, updateOperationMessage.GroupId); batchWriter.WriteEndChangeset(); atomicGroupIdFromRequest = createOperationMessage.GroupId; } // Lexical scope for second half: create("1A"), patch("2A"), query("3A") { batchWriter.WriteStartChangeset(); // Create operation. ODataBatchOperationRequestMessage createOperationMessage = batchWriter.CreateOperationRequestMessage ( "PUT", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "MySingleton")), "1A"); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(createOperationMessage)) { ODataWriter entryWriter = operationMessageWriter.CreateODataResourceWriter(); ODataResource entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = 10 }, new ODataProperty() { Name = "Name", Value = "SingletonWebForBatchJsonLightAtomicGroupIdTest" } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } // A PATCH operation that depends on the preceding PUT operation. string[] dependsOnIds = new string[] { "1A" }; ODataBatchOperationRequestMessage updateOperationMessage = batchWriter.CreateOperationRequestMessage ( "PATCH", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "$1A")), "2A", BatchPayloadUriOption.AbsoluteUri, dependsOnIds); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(updateOperationMessage)) { var entryWriter = operationMessageWriter.CreateODataResourceWriter(); var entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = 11 } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } Assert.Equal(createOperationMessage.GroupId, updateOperationMessage.GroupId); batchWriter.WriteEndChangeset(); atomicGroupAIdFromRequest = createOperationMessage.GroupId; // Query operation ODataBatchOperationRequestMessage queryOperationMessage = batchWriter.CreateOperationRequestMessage("GET", new Uri(serviceDocumentUri + "MySingleton"), "3A"); queryOperationMessage.SetHeader("Accept", "application/json;odata.metadata=full"); } batchWriter.WriteEndBatch(); Assert.NotEqual(atomicGroupIdFromRequest, atomicGroupAIdFromRequest); stream.Position = 0; return(stream.ToArray()); } }
internal static HttpRequestMessage BuildRequestForTableBatchOperation(Uri uri, int?timeout, Uri baseUri, string tableName, TableBatchOperation batch, OperationContext ctx) { HttpRequestMessage msg = BuildRequestCore(NavigationHelper.AppendPathToUri(uri, "$batch"), HttpMethod.Post, timeout, ctx); // create the writer, indent for readability of the examples. ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings() { CheckCharacters = false, // sets this flag on the XmlWriter for ATOM Version = ODataVersion.V2 // set the Odata version to use when writing the entry }; HttpRequestAdapterMessage adapterMsg = new HttpRequestAdapterMessage(msg); // Start Batch ODataMessageWriter odataWriter = new ODataMessageWriter(adapterMsg, writerSettings); ODataBatchWriter batchWriter = odataWriter.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); bool isQuery = batch.Count == 1 && batch[0].OperationType == TableOperationType.Retrieve; // Query operations should not be inside changeset in payload if (!isQuery) { // Start Operation batchWriter.WriteStartChangeset(); batchWriter.Flush(); } foreach (TableOperation operation in batch) { string httpMethod = operation.OperationType == TableOperationType.Merge || operation.OperationType == TableOperationType.InsertOrMerge ? "MERGE" : operation.HttpMethod.Method; ODataBatchOperationRequestMessage mimePartMsg = batchWriter.CreateOperationRequestMessage(httpMethod, operation.GenerateRequestURI(baseUri, tableName)); // etag if (operation.OperationType == TableOperationType.Delete || operation.OperationType == TableOperationType.Replace || operation.OperationType == TableOperationType.Merge) { mimePartMsg.SetHeader("If-Match", operation.Entity.ETag); } if (operation.OperationType != TableOperationType.Delete && operation.OperationType != TableOperationType.Retrieve) { using (ODataMessageWriter batchEntryWriter = new ODataMessageWriter(mimePartMsg, writerSettings)) { // Write entity ODataWriter entryWriter = batchEntryWriter.CreateODataEntryWriter(); WriteOdataEntity(operation.Entity, operation.OperationType, ctx, entryWriter); } } } if (!isQuery) { // End Operation batchWriter.WriteEndChangeset(); } // End Batch batchWriter.WriteEndBatch(); batchWriter.Flush(); return(adapterMsg.GetPopulatedMessage()); }
private byte[] CreateBatchRequest(string batchContentType, int unitRepeatCount) { Debug.Assert(!string.IsNullOrEmpty(batchContentType), "!string.IsNullOrEmpty(batchContentType)"); MemoryStream stream = new MemoryStream(); IODataRequestMessage requestMessage = new InMemoryMessage { Stream = stream }; requestMessage.SetHeader("Content-Type", batchContentType); ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); settings.BaseUri = new Uri(serviceDocumentUri); using (ODataMessageWriter messageWriter = new ODataMessageWriter(requestMessage, settings)) { ODataBatchWriter batchWriter = messageWriter.CreateODataBatchWriter(); batchWriter.WriteStartBatch(); // Each iteration generates a change set with two operations, followed by one top level operation. // Operations count in each iteration is three. // Use API available in OData 7.2 for (int idx = 0; idx < unitRepeatCount * NumOfRequestPerUnit; idx += NumOfRequestPerUnit) { batchWriter.WriteStartChangeset(); ODataBatchOperationRequestMessage createOperationMessage = batchWriter.CreateOperationRequestMessage( "PUT", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "MySingleton")), idx.ToString()); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(createOperationMessage)) { ODataWriter entryWriter = operationMessageWriter.CreateODataResourceWriter(); ODataResource entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = "webid_" + idx }, new ODataProperty() { Name = "Name", Value = this.aLongString } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } // A PATCH operation. ODataBatchOperationRequestMessage updateOperationMessage = batchWriter.CreateOperationRequestMessage( "PATCH", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "MySingleton")), (idx + 1).ToString(), BatchPayloadUriOption.AbsoluteUri); using (ODataMessageWriter operationMessageWriter = new ODataMessageWriter(updateOperationMessage)) { var entryWriter = operationMessageWriter.CreateODataResourceWriter(); var entry = new ODataResource() { TypeName = "NS.Web", Properties = new[] { new ODataProperty() { Name = "WebId", Value = "webid_" + (idx + 1) } } }; entryWriter.WriteStart(entry); entryWriter.WriteEnd(); } batchWriter.WriteEndChangeset(); ODataBatchOperationRequestMessage queryOperationMessage = batchWriter.CreateOperationRequestMessage( "GET", new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", serviceDocumentUri, "MySingleton")), (idx + 2).ToString()); queryOperationMessage.SetHeader("Accept", "application/json;odata.metadata=full"); } batchWriter.WriteEndBatch(); stream.Position = 0; return(stream.ToArray()); } }