diff --git a/src/ServiceBusExplorer.Tests/Helpers/ServiceBusHelperTest.cs b/src/ServiceBusExplorer.Tests/Helpers/ServiceBusHelperTest.cs index bde45a84..7ffdd265 100644 --- a/src/ServiceBusExplorer.Tests/Helpers/ServiceBusHelperTest.cs +++ b/src/ServiceBusExplorer.Tests/Helpers/ServiceBusHelperTest.cs @@ -3,6 +3,8 @@ using ServiceBusExplorer; using System; using NUnit.Framework; +using Microsoft.ServiceBus.Messaging; +using System.IO; #endregion @@ -138,5 +140,160 @@ public void GetAddressRelativeToNamespace_Whitespace_ReturnsWhitespace() Assert.That(helper.GetAddressRelativeToNamespace(" "), Is.EqualTo(" ")); } + + [Test] + public void GetMessageText_ProtobufMessage_WindowsAzureServiceApi_ByteArray() + { + var expectedBodyType = BodyType.ByteArray; + + var helper = new ServiceBusHelper((_, _) => { }); + + var message = CreateProtobufTestMessage(); + var brokeredMessage = new BrokeredMessage(message); + var actualMessageText = helper.GetMessageText(brokeredMessage, false, out var actualBodyType); + + Assert.AreEqual(expectedBodyType, actualBodyType); + Assert.NotNull(actualMessageText); + Assert.IsFalse(string.IsNullOrWhiteSpace(actualMessageText)); + } + + [Test] + public void GetMessageText_ProtobufMessage_WindowsAzureServiceApi_ReadonlyMemoryByte() + { + var expectedBodyType = BodyType.Stream; + + var helper = new ServiceBusHelper((_, _) => { }); + + ReadOnlyMemory message = CreateProtobufTestMessage(); + var brokeredMessage = new BrokeredMessage(message); + var actualMessageText = helper.GetMessageText(brokeredMessage, false, out var actualBodyType); + + Assert.AreEqual(expectedBodyType, actualBodyType); + Assert.NotNull(actualMessageText); + Assert.IsFalse(string.IsNullOrWhiteSpace(actualMessageText)); + } + + /// + /// AzureMessagingServiceBus only allows byte[] and BinaryData as content of the message. + /// This test somehow try to emulate the behavior of the new nuget package. + /// The exception is the same unspecified exception that occurs in test with the real service bus + /// Inside of the package you would do something like + /// Body = BinaryData.FromBytes(myByteArray) + /// + /// The actual message text in real test are like the output of + /// + /// ������& + /// a string that a human can read  + /// readable string" fffff�(@ + /// + [Test] + public void GetMessageText_ProtobufMessage_AzureMessagingServiceBus() + { + var expectedBodyType = BodyType.Stream; + + var helper = new ServiceBusHelper((_, _) => { }); + + var message = CreateProtobufTestMessage(); + var brokeredMessage = new BrokeredMessage(new MemoryStream(message)); + var actualMessageText = helper.GetMessageText(brokeredMessage, false, out var actualBodyType); + + Assert.AreEqual(expectedBodyType, actualBodyType); + Assert.NotNull(actualMessageText); + Assert.IsFalse(string.IsNullOrWhiteSpace(actualMessageText)); + } + + static byte[] CreateProtobufTestMessage() + { + // Due to incompatibility with .net 462 it is not possible to generate a protobuf message inside the code. + return new byte[] + { + 10, + 12, + 8, + 154, + 239, + 224, + 160, + 6, + 16, + 172, + 239, + 162, + 196, + 1, + 18, + 38, + 10, + 30, + 97, + 32, + 115, + 116, + 114, + 105, + 110, + 103, + 32, + 116, + 104, + 97, + 116, + 32, + 97, + 32, + 104, + 117, + 109, + 97, + 110, + 32, + 99, + 97, + 110, + 32, + 114, + 101, + 97, + 100, + 16, + 1, + 26, + 2, + 8, + 12, + 18, + 30, + 10, + 15, + 114, + 101, + 97, + 100, + 97, + 98, + 108, + 101, + 32, + 115, + 116, + 114, + 105, + 110, + 103, + 16, + 2, + 34, + 9, + 9, + 102, + 102, + 102, + 102, + 102, + 230, + 40, + 64 + }; + } } } diff --git a/src/ServiceBusExplorer.Tests/ServiceBusExplorer.Tests.csproj b/src/ServiceBusExplorer.Tests/ServiceBusExplorer.Tests.csproj index 97cf3e14..e72e2bfa 100644 --- a/src/ServiceBusExplorer.Tests/ServiceBusExplorer.Tests.csproj +++ b/src/ServiceBusExplorer.Tests/ServiceBusExplorer.Tests.csproj @@ -27,7 +27,7 @@ - + \ No newline at end of file diff --git a/src/ServiceBusExplorer.sln.DotSettings b/src/ServiceBusExplorer.sln.DotSettings index 64d45c63..588a6dbb 100644 --- a/src/ServiceBusExplorer.sln.DotSettings +++ b/src/ServiceBusExplorer.sln.DotSettings @@ -605,4 +605,5 @@ II.2.12 <HandlesEvent /> <data /> - <data><IncludeFilters /><ExcludeFilters /></data> + <data><IncludeFilters /><ExcludeFilters /></data> + True diff --git a/src/ServiceBusExplorer/Controls/HandleQueueControl.Designer.cs b/src/ServiceBusExplorer/Controls/HandleQueueControl.Designer.cs index 74d425b1..0d950d7e 100644 --- a/src/ServiceBusExplorer/Controls/HandleQueueControl.Designer.cs +++ b/src/ServiceBusExplorer/Controls/HandleQueueControl.Designer.cs @@ -116,6 +116,7 @@ private void InitializeComponent() this.btnDeadletter = new System.Windows.Forms.Button(); this.messagesContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.repairAndResubmitMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.resubmitMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.resubmitSelectedMessagesInBatchModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.saveSelectedMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -124,6 +125,7 @@ private void InitializeComponent() this.saveSelectedMessagesBodyAsFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.deadletterContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.repairAndResubmitDeadletterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.resubmitDeadletterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.resubmitSelectedDeadletterInBatchModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.saveSelectedDeadletteredMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -2088,6 +2090,7 @@ private void InitializeComponent() this.messagesContextMenuStrip.ImageScalingSize = new System.Drawing.Size(20, 20); this.messagesContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.repairAndResubmitMessageToolStripMenuItem, + this.resubmitMessageToolStripMenuItem, this.resubmitSelectedMessagesInBatchModeToolStripMenuItem, this.toolStripSeparator1, this.saveSelectedMessageToolStripMenuItem, @@ -2095,7 +2098,7 @@ private void InitializeComponent() this.saveSelectedMessagesToolStripMenuItem, this.saveSelectedMessagesBodyAsFileToolStripMenuItem}); this.messagesContextMenuStrip.Name = "registrationContextMenuStrip"; - this.messagesContextMenuStrip.Size = new System.Drawing.Size(306, 142); + this.messagesContextMenuStrip.Size = new System.Drawing.Size(306, 186); // // repairAndResubmitMessageToolStripMenuItem // @@ -2104,6 +2107,14 @@ private void InitializeComponent() this.repairAndResubmitMessageToolStripMenuItem.Text = "Repair and Resubmit Selected Message"; this.repairAndResubmitMessageToolStripMenuItem.Click += new System.EventHandler(this.repairAndResubmitMessageToolStripMenuItem_Click); // + // resubmitMessageToolStripMenuItem + // + this.resubmitMessageToolStripMenuItem.Name = "resubmitMessageToolStripMenuItem"; + this.resubmitMessageToolStripMenuItem.Size = new System.Drawing.Size(305, 22); + this.resubmitMessageToolStripMenuItem.Text = "Resubmit Selected Message"; + this.resubmitMessageToolStripMenuItem.ToolTipText = "Resubmits the message with unchanged body."; + this.resubmitMessageToolStripMenuItem.Click += new System.EventHandler(this.resubmitMessageToolStripMenuItem_Click); + // // resubmitSelectedMessagesInBatchModeToolStripMenuItem // this.resubmitSelectedMessagesInBatchModeToolStripMenuItem.Name = "resubmitSelectedMessagesInBatchModeToolStripMenuItem"; @@ -2149,6 +2160,7 @@ private void InitializeComponent() this.deadletterContextMenuStrip.ImageScalingSize = new System.Drawing.Size(20, 20); this.deadletterContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.repairAndResubmitDeadletterToolStripMenuItem, + this.resubmitDeadletterToolStripMenuItem, this.resubmitSelectedDeadletterInBatchModeToolStripMenuItem, this.toolStripSeparator2, this.saveSelectedDeadletteredMessageToolStripMenuItem, @@ -2158,7 +2170,7 @@ private void InitializeComponent() this.deleteSelectedMessageToolStripMenuItem, this.deleteSelectedMessagesToolStripMenuItem}); this.deadletterContextMenuStrip.Name = "registrationContextMenuStrip"; - this.deadletterContextMenuStrip.Size = new System.Drawing.Size(306, 186); + this.deadletterContextMenuStrip.Size = new System.Drawing.Size(306, 208); // // repairAndResubmitDeadletterToolStripMenuItem // @@ -2167,6 +2179,14 @@ private void InitializeComponent() this.repairAndResubmitDeadletterToolStripMenuItem.Text = "Repair And Resubmit Selected Message"; this.repairAndResubmitDeadletterToolStripMenuItem.Click += new System.EventHandler(this.repairAndResubmitDeadletterMessageToolStripMenuItem_Click); // + // resubmitDeadletterToolStripMenuItem + // + this.resubmitDeadletterToolStripMenuItem.Name = "resubmitDeadletterToolStripMenuItem"; + this.resubmitDeadletterToolStripMenuItem.Size = new System.Drawing.Size(305, 22); + this.resubmitDeadletterToolStripMenuItem.Text = "Resubmit Selected Message"; + this.resubmitDeadletterToolStripMenuItem.ToolTipText = "Resubmits the deadletter message with unchanged body."; + this.resubmitDeadletterToolStripMenuItem.Click += new System.EventHandler(this.resubmitDeadletterMessageToolStripMenuItem_Click); + // // resubmitSelectedDeadletterInBatchModeToolStripMenuItem // this.resubmitSelectedDeadletterInBatchModeToolStripMenuItem.Name = "resubmitSelectedDeadletterInBatchModeToolStripMenuItem"; @@ -2554,5 +2574,7 @@ private void InitializeComponent() private System.Windows.Forms.PropertyGrid messageCustomPropertyGrid; private System.Windows.Forms.PropertyGrid deadletterCustomPropertyGrid; private System.Windows.Forms.PropertyGrid transferDeadletterCustomPropertyGrid; + private System.Windows.Forms.ToolStripMenuItem resubmitDeadletterToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem resubmitMessageToolStripMenuItem; } } diff --git a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs index cc0c7ab3..711cc116 100644 --- a/src/ServiceBusExplorer/Controls/HandleQueueControl.cs +++ b/src/ServiceBusExplorer/Controls/HandleQueueControl.cs @@ -3317,6 +3317,7 @@ private void messagesDataGridView_CellMouseDown(object sender, DataGridViewCellM messagesDataGridView.Rows[e.RowIndex].Selected = true; var multipleSelectedRows = messagesDataGridView.SelectedRows.Count > 1; repairAndResubmitMessageToolStripMenuItem.Visible = !multipleSelectedRows; + resubmitMessageToolStripMenuItem.Visible = !multipleSelectedRows; saveSelectedMessageToolStripMenuItem.Visible = !multipleSelectedRows; saveSelectedMessageBodyAsFileToolStripMenuItem.Visible = !multipleSelectedRows; resubmitSelectedMessagesInBatchModeToolStripMenuItem.Visible = multipleSelectedRows; @@ -3331,7 +3332,17 @@ private void repairAndResubmitMessageToolStripMenuItem_Click(object sender, Even new DataGridViewCellEventArgs(0, currentMessageRowIndex)); } + private void resubmitMessageToolStripMenuItem_Click(object sender, EventArgs e) + { + ResubmitSelectedMessages(); + } + private void resubmitSelectedMessagesInBatchModeToolStripMenuItem_Click(object sender, EventArgs e) + { + ResubmitSelectedMessages(); + } + + private void ResubmitSelectedMessages() { try { @@ -3339,8 +3350,9 @@ private void resubmitSelectedMessagesInBatchModeToolStripMenuItem_Click(object s { return; } + using (var form = new MessageForm(queueDescription, messagesDataGridView.SelectedRows.Cast() - .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) + .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); } @@ -3433,6 +3445,7 @@ private void deadletterDataGridView_CellMouseDown(object sender, DataGridViewCel var multipleSelectedRows = deadletterDataGridView.SelectedRows.Count > 1; repairAndResubmitDeadletterToolStripMenuItem.Visible = !multipleSelectedRows; + resubmitDeadletterToolStripMenuItem.Visible = !multipleSelectedRows; saveSelectedDeadletteredMessageToolStripMenuItem.Visible = !multipleSelectedRows; saveSelectedDeadletteredMessageBodyAsFileToolStripMenuItem.Visible = !multipleSelectedRows; deleteSelectedMessageToolStripMenuItem.Visible = !multipleSelectedRows; @@ -3468,8 +3481,18 @@ private void repairAndResubmitDeadletterMessageToolStripMenuItem_Click(object se new DataGridViewCellEventArgs(0, currentDeadletterMessageRowIndex)); } + private async void resubmitDeadletterMessageToolStripMenuItem_Click(object sender, EventArgs e) + { + await ResubmitSelectedDeadletterMessages(); + } + private async void resubmitSelectedDeadletterMessagesInBatchModeToolStripMenuItem_Click(object sender, EventArgs e) + { + await ResubmitSelectedDeadletterMessages(); + } + + async Task ResubmitSelectedDeadletterMessages() { try { @@ -3477,8 +3500,9 @@ private async void resubmitSelectedDeadletterMessagesInBatchModeToolStripMenuIte { return; } + using (var form = new MessageForm(queueDescription, deadletterDataGridView.SelectedRows.Cast() - .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) + .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); if (form.RemovedSequenceNumbers != null && form.RemovedSequenceNumbers.Any()) diff --git a/src/ServiceBusExplorer/Controls/HandleQueueControl.resx b/src/ServiceBusExplorer/Controls/HandleQueueControl.resx index fe12d64d..8f7aada8 100644 --- a/src/ServiceBusExplorer/Controls/HandleQueueControl.resx +++ b/src/ServiceBusExplorer/Controls/HandleQueueControl.resx @@ -124,7 +124,7 @@ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - EQAACxEBf2RfkQAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I + DAAACwwBP0AiyAAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I e5ck0cSiTMWE0HI6dWq7oGLTOfO2edyW052zzc3LtKl43TlnNzRteEvNzbMp5aUsE+dlXpIi0l9HCLcO QwWFL+fV83w4PL9jsN52mCoNhHFo1vF17bAQmQKzt/fNHAFEhuhtPqAaM1GgG77GQS+ltQfxjQzYKmkZ rjUTKtxOmfSOClUaxp6VWQMSUZqQeCqfCxLMBGZN3Ejvv5vXVdQ4vIf1H0Qqj4Rvz7O6Mxs2s3QgUQno @@ -161,7 +161,7 @@ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - EQAACxEBf2RfkQAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I + DAAACwwBP0AiyAAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I e5ck0cSiTMWE0HI6dWq7oGLTOfO2edyW052zzc3LtKl43TlnNzRteEvNzbMp5aUsE+dlXpIi0l9HCLcO QwWFL+fV83w4PL9jsN52mCoNhHFo1vF17bAQmQKzt/fNHAFEhuhtPqAaM1GgG77GQS+ltQfxjQzYKmkZ rjUTKtxOmfSOClUaxp6VWQMSUZqQeCqfCxLMBGZN3Ejvv5vXVdQ4vIf1H0Qqj4Rvz7O6Mxs2s3QgUQno @@ -198,7 +198,7 @@ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - EQAACxEBf2RfkQAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I + DAAACwwBP0AiyAAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I e5ck0cSiTMWE0HI6dWq7oGLTOfO2edyW052zzc3LtKl43TlnNzRteEvNzbMp5aUsE+dlXpIi0l9HCLcO QwWFL+fV83w4PL9jsN52mCoNhHFo1vF17bAQmQKzt/fNHAFEhuhtPqAaM1GgG77GQS+ltQfxjQzYKmkZ rjUTKtxOmfSOClUaxp6VWQMSUZqQeCqfCxLMBGZN3Ejvv5vXVdQ4vIf1H0Qqj4Rvz7O6Mxs2s3QgUQno @@ -260,6 +260,6 @@ 390, 57 - 47 + 116 \ No newline at end of file diff --git a/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.Designer.cs b/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.Designer.cs index f90cc0cf..db3918b1 100644 --- a/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.Designer.cs +++ b/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.Designer.cs @@ -106,6 +106,7 @@ private void InitializeComponent() this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); this.deadletterContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.repairAndResubmitDeadletterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.resubmitDeadletterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.resubmitSelectedDeadletterInBatchModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.saveSelectedDeadletteredMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -114,6 +115,7 @@ private void InitializeComponent() this.deleteSelectedMessagesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.messagesContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.repairAndResubmitMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.resubmitMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.resubmitSelectedMessagesInBatchModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.saveSelectedMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -1082,7 +1084,7 @@ private void InitializeComponent() '\"', '\'', '\''}; - this.txtMessageText.AutoScrollMinSize = new System.Drawing.Size(27, 14); + this.txtMessageText.AutoScrollMinSize = new System.Drawing.Size(2, 14); this.txtMessageText.BackBrush = null; this.txtMessageText.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.txtMessageText.CharHeight = 14; @@ -1377,14 +1379,13 @@ private void InitializeComponent() '\"', '\'', '\''}; - this.txtDeadletterText.AutoScrollMinSize = new System.Drawing.Size(27, 14); + this.txtDeadletterText.AutoScrollMinSize = new System.Drawing.Size(2, 14); this.txtDeadletterText.BackBrush = null; this.txtDeadletterText.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.txtDeadletterText.CharHeight = 14; this.txtDeadletterText.CharWidth = 8; this.txtDeadletterText.Cursor = System.Windows.Forms.Cursors.IBeam; this.txtDeadletterText.DisabledColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); - this.txtDeadletterText.Font = new System.Drawing.Font("Courier New", 9.75F); this.txtDeadletterText.ForeColor = System.Drawing.SystemColors.ControlText; this.txtDeadletterText.IsReplaceMode = false; this.txtDeadletterText.Location = new System.Drawing.Point(16, 32); @@ -1688,6 +1689,7 @@ private void InitializeComponent() this.deadletterContextMenuStrip.ImageScalingSize = new System.Drawing.Size(20, 20); this.deadletterContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.repairAndResubmitDeadletterToolStripMenuItem, + this.resubmitDeadletterToolStripMenuItem, this.resubmitSelectedDeadletterInBatchModeToolStripMenuItem, this.toolStripSeparator2, this.saveSelectedDeadletteredMessageToolStripMenuItem, @@ -1695,7 +1697,7 @@ private void InitializeComponent() this.deleteSelectedMessageToolStripMenuItem, this.deleteSelectedMessagesToolStripMenuItem}); this.deadletterContextMenuStrip.Name = "registrationContextMenuStrip"; - this.deadletterContextMenuStrip.Size = new System.Drawing.Size(306, 142); + this.deadletterContextMenuStrip.Size = new System.Drawing.Size(306, 186); // // repairAndResubmitDeadletterToolStripMenuItem // @@ -1704,6 +1706,14 @@ private void InitializeComponent() this.repairAndResubmitDeadletterToolStripMenuItem.Text = "Repair And Resubmit Selected Message"; this.repairAndResubmitDeadletterToolStripMenuItem.Click += new System.EventHandler(this.repairAndResubmitDeadletterMessageToolStripMenuItem_Click); // + // resubmitDeadletterToolStripMenuItem + // + this.resubmitDeadletterToolStripMenuItem.Name = "resubmitDeadletterToolStripMenuItem"; + this.resubmitDeadletterToolStripMenuItem.Size = new System.Drawing.Size(305, 22); + this.resubmitDeadletterToolStripMenuItem.Text = "Resubmit Selected Message"; + this.resubmitDeadletterToolStripMenuItem.ToolTipText = "Resubmits the deadletter message with unchanged body."; + this.resubmitDeadletterToolStripMenuItem.Click += new System.EventHandler(this.resubmitDeadletterMessageToolStripMenuItem_Click); + // // resubmitSelectedDeadletterInBatchModeToolStripMenuItem // this.resubmitSelectedDeadletterInBatchModeToolStripMenuItem.Name = "resubmitSelectedDeadletterInBatchModeToolStripMenuItem"; @@ -1749,12 +1759,13 @@ private void InitializeComponent() this.messagesContextMenuStrip.ImageScalingSize = new System.Drawing.Size(20, 20); this.messagesContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.repairAndResubmitMessageToolStripMenuItem, + this.resubmitMessageToolStripMenuItem, this.resubmitSelectedMessagesInBatchModeToolStripMenuItem, this.toolStripSeparator1, this.saveSelectedMessageToolStripMenuItem, this.saveSelectedMessagesToolStripMenuItem}); this.messagesContextMenuStrip.Name = "registrationContextMenuStrip"; - this.messagesContextMenuStrip.Size = new System.Drawing.Size(306, 98); + this.messagesContextMenuStrip.Size = new System.Drawing.Size(306, 120); // // repairAndResubmitMessageToolStripMenuItem // @@ -1763,6 +1774,14 @@ private void InitializeComponent() this.repairAndResubmitMessageToolStripMenuItem.Text = "Repair And Resubmit Selected Message"; this.repairAndResubmitMessageToolStripMenuItem.Click += new System.EventHandler(this.repairAndResubmitMessageToolStripMenuItem_Click); // + // resubmitMessageToolStripMenuItem + // + this.resubmitMessageToolStripMenuItem.Name = "resubmitMessageToolStripMenuItem"; + this.resubmitMessageToolStripMenuItem.Size = new System.Drawing.Size(305, 22); + this.resubmitMessageToolStripMenuItem.Text = "Resubmit Selected Message"; + this.resubmitMessageToolStripMenuItem.ToolTipText = "Resubmits the message with unchanged body."; + this.resubmitMessageToolStripMenuItem.Click += new System.EventHandler(this.resubmitMessageToolStripMenuItem_Click); + // // resubmitSelectedMessagesInBatchModeToolStripMenuItem // this.resubmitSelectedMessagesInBatchModeToolStripMenuItem.Name = "resubmitSelectedMessagesInBatchModeToolStripMenuItem"; @@ -2008,5 +2027,7 @@ private void InitializeComponent() private TimeSpanControl tsLockDuration; private System.Windows.Forms.PropertyGrid messageCustomPropertyGrid; private System.Windows.Forms.PropertyGrid deadletterCustomPropertyGrid; + private System.Windows.Forms.ToolStripMenuItem resubmitDeadletterToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem resubmitMessageToolStripMenuItem; } } diff --git a/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.cs b/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.cs index 48522ef1..24b1ba20 100644 --- a/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.cs +++ b/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.cs @@ -2282,6 +2282,7 @@ private void messagesDataGridView_CellMouseDown(object sender, DataGridViewCellM messagesDataGridView.Rows[e.RowIndex].Selected = true; var multipleSelectedRows = messagesDataGridView.SelectedRows.Count > 1; repairAndResubmitMessageToolStripMenuItem.Visible = !multipleSelectedRows; + resubmitMessageToolStripMenuItem.Visible = !multipleSelectedRows; saveSelectedMessageToolStripMenuItem.Visible = !multipleSelectedRows; resubmitSelectedMessagesInBatchModeToolStripMenuItem.Visible = multipleSelectedRows; saveSelectedMessagesToolStripMenuItem.Visible = multipleSelectedRows; @@ -2293,7 +2294,17 @@ private void repairAndResubmitMessageToolStripMenuItem_Click(object sender, Even messagesDataGridView_CellDoubleClick(messagesDataGridView, new DataGridViewCellEventArgs(0, currentMessageRowIndex)); } + private void resubmitMessageToolStripMenuItem_Click(object sender, EventArgs e) + { + ResubmitSelectedMessages(); + } + private void resubmitSelectedMessagesInBatchModeToolStripMenuItem_Click(object sender, EventArgs e) + { + ResubmitSelectedMessages(); + } + + private void ResubmitSelectedMessages() { try { @@ -2301,8 +2312,9 @@ private void resubmitSelectedMessagesInBatchModeToolStripMenuItem_Click(object s { return; } + using (var form = new MessageForm(subscriptionWrapper, messagesDataGridView.SelectedRows.Cast() - .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) + .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); } @@ -2395,6 +2407,7 @@ private void deadletterDataGridView_CellMouseDown(object sender, DataGridViewCel var multipleSelectedRows = deadletterDataGridView.SelectedRows.Count > 1; repairAndResubmitDeadletterToolStripMenuItem.Visible = !multipleSelectedRows; + resubmitDeadletterToolStripMenuItem.Visible = !multipleSelectedRows; saveSelectedDeadletteredMessageToolStripMenuItem.Visible = !multipleSelectedRows; deleteSelectedMessageToolStripMenuItem.Visible = !multipleSelectedRows; @@ -2410,7 +2423,17 @@ private void repairAndResubmitDeadletterMessageToolStripMenuItem_Click(object se deadletterDataGridView_CellDoubleClick(deadletterDataGridView, new DataGridViewCellEventArgs(0, currentDeadletterMessageRowIndex)); } + private async void resubmitDeadletterMessageToolStripMenuItem_Click(object sender, EventArgs e) + { + await ResubmitSelectedDeadletterMessages(); + } + private async void resubmitSelectedDeadletterMessagesInBatchModeToolStripMenuItem_Click(object sender, EventArgs e) + { + await ResubmitSelectedDeadletterMessages(); + } + + private async Task ResubmitSelectedDeadletterMessages() { try { @@ -2418,8 +2441,9 @@ private async void resubmitSelectedDeadletterMessagesInBatchModeToolStripMenuIte { return; } + using (var form = new MessageForm(subscriptionWrapper, deadletterDataGridView.SelectedRows.Cast() - .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) + .Select(r => (BrokeredMessage)r.DataBoundItem), serviceBusHelper, writeToLog)) { form.ShowDialog(); if (form.RemovedSequenceNumbers != null && form.RemovedSequenceNumbers.Any()) diff --git a/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.resx b/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.resx index 5c33867b..91d55fa8 100644 --- a/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.resx +++ b/src/ServiceBusExplorer/Controls/HandleSubscriptionControl.resx @@ -124,7 +124,7 @@ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - EQAACxEBf2RfkQAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I + DAAACwwBP0AiyAAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I e5ck0cSiTMWE0HI6dWq7oGLTOfO2edyW052zzc3LtKl43TlnNzRteEvNzbMp5aUsE+dlXpIi0l9HCLcO QwWFL+fV83w4PL9jsN52mCoNhHFo1vF17bAQmQKzt/fNHAFEhuhtPqAaM1GgG77GQS+ltQfxjQzYKmkZ rjUTKtxOmfSOClUaxp6VWQMSUZqQeCqfCxLMBGZN3Ejvv5vXVdQ4vIf1H0Qqj4Rvz7O6Mxs2s3QgUQno @@ -161,7 +161,7 @@ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - EQAACxEBf2RfkQAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I + DAAACwwBP0AiyAAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I e5ck0cSiTMWE0HI6dWq7oGLTOfO2edyW052zzc3LtKl43TlnNzRteEvNzbMp5aUsE+dlXpIi0l9HCLcO QwWFL+fV83w4PL9jsN52mCoNhHFo1vF17bAQmQKzt/fNHAFEhuhtPqAaM1GgG77GQS+ltQfxjQzYKmkZ rjUTKtxOmfSOClUaxp6VWQMSUZqQeCqfCxLMBGZN3Ejvv5vXVdQ4vIf1H0Qqj4Rvz7O6Mxs2s3QgUQno diff --git a/src/ServiceBusExplorer/Controls/ListenerControl.Designer.cs b/src/ServiceBusExplorer/Controls/ListenerControl.Designer.cs index cbeda7e4..8b2c12ab 100644 --- a/src/ServiceBusExplorer/Controls/ListenerControl.Designer.cs +++ b/src/ServiceBusExplorer/Controls/ListenerControl.Designer.cs @@ -78,6 +78,7 @@ private void InitializeComponent() this.messageCustomPropertyGrid = new System.Windows.Forms.PropertyGrid(); this.messagesContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.repairAndResubmitMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.resubmitMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.resubmitSelectedMessagesInBatchModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.saveSelectedMessageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -273,6 +274,7 @@ private void InitializeComponent() this.txtMessageSizePerSecond.AllowDecimal = false; this.txtMessageSizePerSecond.AllowNegative = false; this.txtMessageSizePerSecond.AllowSpace = false; + this.txtMessageSizePerSecond.IsZeroWhenEmpty = false; this.txtMessageSizePerSecond.Location = new System.Drawing.Point(160, 88); this.txtMessageSizePerSecond.Name = "txtMessageSizePerSecond"; this.txtMessageSizePerSecond.Size = new System.Drawing.Size(88, 20); @@ -293,6 +295,7 @@ private void InitializeComponent() this.txtAverageDuration.AllowDecimal = false; this.txtAverageDuration.AllowNegative = false; this.txtAverageDuration.AllowSpace = false; + this.txtAverageDuration.IsZeroWhenEmpty = false; this.txtAverageDuration.Location = new System.Drawing.Point(16, 88); this.txtAverageDuration.Name = "txtAverageDuration"; this.txtAverageDuration.Size = new System.Drawing.Size(80, 20); @@ -303,6 +306,7 @@ private void InitializeComponent() this.txtMessagesTotal.AllowDecimal = false; this.txtMessagesTotal.AllowNegative = false; this.txtMessagesTotal.AllowSpace = false; + this.txtMessagesTotal.IsZeroWhenEmpty = false; this.txtMessagesTotal.Location = new System.Drawing.Point(16, 48); this.txtMessagesTotal.Name = "txtMessagesTotal"; this.txtMessagesTotal.Size = new System.Drawing.Size(128, 20); @@ -323,6 +327,7 @@ private void InitializeComponent() this.txtMessagesPerSecond.AllowDecimal = false; this.txtMessagesPerSecond.AllowNegative = false; this.txtMessagesPerSecond.AllowSpace = false; + this.txtMessagesPerSecond.IsZeroWhenEmpty = false; this.txtMessagesPerSecond.Location = new System.Drawing.Point(160, 48); this.txtMessagesPerSecond.Name = "txtMessagesPerSecond"; this.txtMessagesPerSecond.Size = new System.Drawing.Size(88, 20); @@ -530,6 +535,7 @@ private void InitializeComponent() this.txtMessageWaitTimeout.AllowDecimal = false; this.txtMessageWaitTimeout.AllowNegative = false; this.txtMessageWaitTimeout.AllowSpace = false; + this.txtMessageWaitTimeout.IsZeroWhenEmpty = false; this.txtMessageWaitTimeout.Location = new System.Drawing.Point(632, 48); this.txtMessageWaitTimeout.Name = "txtMessageWaitTimeout"; this.txtMessageWaitTimeout.Size = new System.Drawing.Size(96, 20); @@ -551,6 +557,7 @@ private void InitializeComponent() this.txtAutoRenewTimeout.AllowDecimal = false; this.txtAutoRenewTimeout.AllowNegative = false; this.txtAutoRenewTimeout.AllowSpace = false; + this.txtAutoRenewTimeout.IsZeroWhenEmpty = false; this.txtAutoRenewTimeout.Location = new System.Drawing.Point(496, 48); this.txtAutoRenewTimeout.Name = "txtAutoRenewTimeout"; this.txtAutoRenewTimeout.Size = new System.Drawing.Size(96, 20); @@ -572,6 +579,7 @@ private void InitializeComponent() this.txtPrefetchCount.AllowDecimal = false; this.txtPrefetchCount.AllowNegative = false; this.txtPrefetchCount.AllowSpace = false; + this.txtPrefetchCount.IsZeroWhenEmpty = false; this.txtPrefetchCount.Location = new System.Drawing.Point(256, 48); this.txtPrefetchCount.Name = "txtPrefetchCount"; this.txtPrefetchCount.Size = new System.Drawing.Size(96, 20); @@ -686,6 +694,7 @@ private void InitializeComponent() this.txtRefreshInformation.AllowDecimal = false; this.txtRefreshInformation.AllowNegative = false; this.txtRefreshInformation.AllowSpace = false; + this.txtRefreshInformation.IsZeroWhenEmpty = false; this.txtRefreshInformation.Location = new System.Drawing.Point(136, 48); this.txtRefreshInformation.Name = "txtRefreshInformation"; this.txtRefreshInformation.Size = new System.Drawing.Size(96, 20); @@ -708,6 +717,7 @@ private void InitializeComponent() this.txtMaxConcurrentCalls.AllowDecimal = false; this.txtMaxConcurrentCalls.AllowNegative = false; this.txtMaxConcurrentCalls.AllowSpace = false; + this.txtMaxConcurrentCalls.IsZeroWhenEmpty = false; this.txtMaxConcurrentCalls.Location = new System.Drawing.Point(16, 48); this.txtMaxConcurrentCalls.Name = "txtMaxConcurrentCalls"; this.txtMaxConcurrentCalls.Size = new System.Drawing.Size(96, 20); @@ -895,7 +905,6 @@ private void InitializeComponent() this.txtMessageText.CharWidth = 8; this.txtMessageText.Cursor = System.Windows.Forms.Cursors.IBeam; this.txtMessageText.DisabledColor = System.Drawing.Color.FromArgb(((int)(((byte)(100)))), ((int)(((byte)(180)))), ((int)(((byte)(180)))), ((int)(((byte)(180))))); - this.txtMessageText.Font = new System.Drawing.Font("Courier New", 9.75F); this.txtMessageText.ForeColor = System.Drawing.SystemColors.ControlText; this.txtMessageText.IsReplaceMode = false; this.txtMessageText.Location = new System.Drawing.Point(16, 32); @@ -1010,12 +1019,13 @@ private void InitializeComponent() // this.messagesContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.repairAndResubmitMessageToolStripMenuItem, + this.resubmitMessageToolStripMenuItem, this.resubmitSelectedMessagesInBatchModeToolStripMenuItem, this.toolStripSeparator1, this.saveSelectedMessageToolStripMenuItem, this.saveSelectedMessagesToolStripMenuItem}); this.messagesContextMenuStrip.Name = "registrationContextMenuStrip"; - this.messagesContextMenuStrip.Size = new System.Drawing.Size(306, 98); + this.messagesContextMenuStrip.Size = new System.Drawing.Size(306, 142); // // repairAndResubmitMessageToolStripMenuItem // @@ -1024,6 +1034,14 @@ private void InitializeComponent() this.repairAndResubmitMessageToolStripMenuItem.Text = "Repair and Resubmit Selected Message"; this.repairAndResubmitMessageToolStripMenuItem.Click += new System.EventHandler(this.repairAndResubmitMessageToolStripMenuItem_Click); // + // resubmitMessageToolStripMenuItem + // + this.resubmitMessageToolStripMenuItem.Name = "resubmitMessageToolStripMenuItem"; + this.resubmitMessageToolStripMenuItem.Size = new System.Drawing.Size(305, 22); + this.resubmitMessageToolStripMenuItem.Text = "Resubmit Selected Message"; + this.resubmitMessageToolStripMenuItem.ToolTipText = "Resubmits the message with unchanged body."; + this.resubmitMessageToolStripMenuItem.Click += new System.EventHandler(this.resubmitMessageToolStripMenuItem_Click); + // // resubmitSelectedMessagesInBatchModeToolStripMenuItem // this.resubmitSelectedMessagesInBatchModeToolStripMenuItem.Name = "resubmitSelectedMessagesInBatchModeToolStripMenuItem"; @@ -1226,5 +1244,6 @@ private void InitializeComponent() private FastColoredTextBoxNS.FastColoredTextBox txtMessageText; private Grouper grouperMessageCustomProperties; private System.Windows.Forms.PropertyGrid messageCustomPropertyGrid; + private System.Windows.Forms.ToolStripMenuItem resubmitMessageToolStripMenuItem; } } diff --git a/src/ServiceBusExplorer/Controls/ListenerControl.cs b/src/ServiceBusExplorer/Controls/ListenerControl.cs index 7d813e2a..0d573b9a 100644 --- a/src/ServiceBusExplorer/Controls/ListenerControl.cs +++ b/src/ServiceBusExplorer/Controls/ListenerControl.cs @@ -710,6 +710,7 @@ private void messagesDataGridView_CellMouseDown(object sender, DataGridViewCellM messagesDataGridView.Rows[e.RowIndex].Selected = true; var multipleSelectedRows = messagesDataGridView.SelectedRows.Count > 1; repairAndResubmitMessageToolStripMenuItem.Visible = !multipleSelectedRows; + resubmitMessageToolStripMenuItem.Visible = !multipleSelectedRows; saveSelectedMessageToolStripMenuItem.Visible = !multipleSelectedRows; resubmitSelectedMessagesInBatchModeToolStripMenuItem.Visible = multipleSelectedRows; saveSelectedMessagesToolStripMenuItem.Visible = multipleSelectedRows; @@ -721,7 +722,17 @@ private void repairAndResubmitMessageToolStripMenuItem_Click(object sender, Even messagesDataGridView_CellDoubleClick(messagesDataGridView, new DataGridViewCellEventArgs(0, currentMessageRowIndex)); } + private async void resubmitMessageToolStripMenuItem_Click(object sender, EventArgs e) + { + await ResubmitSelectedMessages(); + } + private async void resubmitSelectedMessagesInBatchModeToolStripMenuItem_Click(object sender, EventArgs e) + { + await ResubmitSelectedMessages(); + } + + private async Task ResubmitSelectedMessages() { try { @@ -729,6 +740,7 @@ private async void resubmitSelectedMessagesInBatchModeToolStripMenuItem_Click(ob { return; } + string entityPath; using (var form = new SelectEntityForm(SelectEntityDialogTitle, SelectEntityGrouperTitle, SelectEntityLabelText)) { @@ -736,12 +748,15 @@ private async void resubmitSelectedMessagesInBatchModeToolStripMenuItem_Click(ob { return; } + if (string.IsNullOrWhiteSpace(form.Path)) { return; } + entityPath = form.Path; } + var sent = 0; var messageSender = await serviceBusHelper.MessagingFactory.CreateMessageSenderAsync(entityPath); var messages = messagesDataGridView.SelectedRows.Cast().Select(r => @@ -750,26 +765,27 @@ private async void resubmitSelectedMessagesInBatchModeToolStripMenuItem_Click(ob serviceBusHelper.GetMessageText(message, MainForm.SingletonMainForm.UseAscii, out var bodyType); if (bodyType == BodyType.Wcf) { - var wcfUri = serviceBusHelper.IsCloudNamespace ? - new Uri(serviceBusHelper.NamespaceUri, messageSender.Path) : - new UriBuilder - { - Host = serviceBusHelper.NamespaceUri.Host, - Path = $"{serviceBusHelper.NamespaceUri.AbsolutePath}/{messageSender.Path}", - Scheme = "sb" - }.Uri; + var wcfUri = serviceBusHelper.IsCloudNamespace + ? new Uri(serviceBusHelper.NamespaceUri, messageSender.Path) + : new UriBuilder + { + Host = serviceBusHelper.NamespaceUri.Host, + Path = $"{serviceBusHelper.NamespaceUri.AbsolutePath}/{messageSender.Path}", + Scheme = "sb" + }.Uri; return serviceBusHelper.CreateMessageForWcfReceiver(message, - 0, - false, - false, - wcfUri); + 0, + false, + false, + wcfUri); } + return serviceBusHelper.CreateMessageForApiReceiver(message, - 0, - false, - false, - bodyType, - null); + 0, + false, + false, + bodyType, + null); }); IEnumerable brokeredMessages = messages as IList ?? messages.ToList(); if (brokeredMessages.Any()) @@ -777,6 +793,7 @@ private async void resubmitSelectedMessagesInBatchModeToolStripMenuItem_Click(ob sent = brokeredMessages.Count(); await messageSender.SendBatchAsync(brokeredMessages); } + writeToLog(string.Format(MessageSentMessage, sent, entityPath)); } catch (Exception ex) diff --git a/src/ServiceBusExplorer/Controls/ListenerControl.resx b/src/ServiceBusExplorer/Controls/ListenerControl.resx index 3280ab5f..551cd3d9 100644 --- a/src/ServiceBusExplorer/Controls/ListenerControl.resx +++ b/src/ServiceBusExplorer/Controls/ListenerControl.resx @@ -124,7 +124,7 @@ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - EQAACxEBf2RfkQAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I + DgAACw4BQL7hQQAAAAd0SU1FB90LGg8kOha4XJIAAAMOSURBVDhPrdHrS1NxGMDx/ohehVnWi4gKur4I e5ck0cSiTMWE0HI6dWq7oGLTOfO2edyW052zzc3LtKl43TlnNzRteEvNzbMp5aUsE+dlXpIi0l9HCLcO QwWFL+fV83w4PL9jsN52mCoNhHFo1vF17bAQmQKzt/fNHAFEhuhtPqAaM1GgG77GQS+ltQfxjQzYKmkZ rjUTKtxOmfSOClUaxp6VWQMSUZqQeCqfCxLMBGZN3Ejvv5vXVdQ4vIf1H0Qqj4Rvz7O6Mxs2s3QgUQno