Code Monkey home page Code Monkey logo

azure-amqp's Introduction

Microsoft Azure AMQP for .Net

Build status  NuGet Version and Downloads count

This repository contains the source code for the Microsoft Azure AMQP for C# implementation.

This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact [email protected] with any additional questions or comments.

Build

  • In Visual Studio
    • Open the solution amqp.sln and build. Visual Studio 2019 is required.
  • dotnet
    • The project targets netstandard2.0, so dotnet commands can be used to build the library cross platform.
dotnet build -p:Version=3.0.0 src\Microsoft.Azure.Amqp.csproj

azure-amqp's People

Contributors

affandar avatar albertodenatale avatar alexsorokoletov avatar arturl avatar bainian12345 avatar bartdesmet avatar bjolo360 avatar cesarme avatar danielmarbach avatar dcristoloveanu avatar dlstucki avatar eerhardt avatar gmileka avatar jhendrixmsft avatar makam avatar microsoft-github-policy-service[bot] avatar myagley avatar nemakam avatar paulsavides-advicent avatar rajeevmv avatar rdeveen avatar serkantkaraca avatar sjkwak avatar tameraw avatar timtay-microsoft avatar tlecomte avatar varunpuranik avatar vinaysurya avatar xinchen10 avatar yvgopal avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

azure-amqp's Issues

Remove annotation properties of output message is not working

Hi, team,
I try to remove annotation property from output message use the method below:

outMessage.MessageAnnotations.Map.TryRemoveValue

However, after calling outMessage. GetPayload (), the messasge annotation is reappearing again.

Here is the full test code which modified from the test case “AmqpMessageReceiveResendTest”:

	var message = AmqpMessage.Create(new AmqpValue { Value = "Hello, AMQP!" });
	message.MessageAnnotations.Map["key"] = "old";

	// send the message and receive it on remote side
	var payload = message.GetPayload();
	var streamMessage = AmqpMessage.CreateAmqpStreamMessage(new BufferListStream(payload));

	//new OutputMessage for resending with modified sections
	var stream = BufferListStream.Create(streamMessage.ToStream(), AmqpConstants.SegmentSize, streamMessage.Settled);
	stream.Seek(0, System.IO.SeekOrigin.Begin);
	var outMessage = AmqpMessage.CreateOutputMessage(stream, false);
	outMessage.Settled = streamMessage.Settled;
	//explicitly assign
	outMessage.Header.Priority = 99;
	outMessage.DeliveryAnnotations.Map["key"] = "da-update";
	outMessage.MessageAnnotations.Map["key"] = "update";

	var  result = outMessage.MessageAnnotations.Map.TryRemoveValue("key", out string value2);

	// Now the value is null
	var annotationValue1 = outMessage.MessageAnnotations.Map["key"];

	var payload2 = outMessage.GetPayload();

	// Now the value is "old"
	var annotationValue2 = outMessage.MessageAnnotations.Map["key"];

As you can see from comments, annotation proprety reapear after calling GetPayload Method.
Not sure whether it is related to the mistake using of MessageAnnotations or just is a bug.

The version is 2.3.7

Thanks for your help!

Update .gitignore

  1. it contains many invalid entries
  2. after build, I still get files under the untracked list in VS.

MissingManifestResourceException

In my Xamarin.Forms-application I'm using the Event Hub-NuGet which uses this package. Sporadically following exception occurs on an Android device using language nl-BE:

Xamarin caused by: android.runtime.JavaProxyThrowable: System.Resources.MissingManifestResourceException: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "Microsoft.Azure.Amqp.Amqp.Resources.resources" was correctly embedded or linked into assembly "Microsoft.Azure.Amqp" at compile time, or that all the satellite assemblies required are loadable and fully signed.
at System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing (System.String fileName) [0x000bf] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet (System.Globalization.CultureInfo culture, System.Collections.Generic.Dictionary`2[TKey,TValue] localResourceSets, System.Boolean tryParents, System.Boolean createIfNotExists, System.Threading.StackCrawlMark& stackMark) [0x000d9] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo requestedCulture, System.Boolean createIfNotExists, System.Boolean tryParents, System.Threading.StackCrawlMark& stackMark) [0x00099] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, System.Boolean createIfNotExists, System.Boolean tryParents) [0x00002] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Resources.ResourceManager.GetString (System.String name, System.Globalization.CultureInfo culture) [0x0005a] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at Microsoft.Azure.Amqp.Amqp.Resources.get_AmqpTimeout () [0x00005] in <6762560bba6a4a31b520554a2d001f08>:0 
at Microsoft.Azure.Amqp.TimeoutAsyncResult`1[T].CompleteOnTimer () [0x00000] in <6762560bba6a4a31b520554a2d001f08>:0 
at Microsoft.Azure.Amqp.TimeoutAsyncResult`1[T].OnTimerCallback (System.Object state) [0x00000] in <6762560bba6a4a31b520554a2d001f08>:0 
at Microsoft.Azure.Amqp.TimeoutAsyncResult`1+<>c[T].<SetTimer>b__5_0 (System.Object s) [0x00000] in <6762560bba6a4a31b520554a2d001f08>:0 
at System.Threading.Timer+Scheduler.TimerCB (System.Object o) [0x00007] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x00008] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00074] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in <896ad1d315ca4ba7b117efb8dacaedcf>:0

For testing purposes I've altered OperationTimeout in the EventHubsConnectionStringBuilder to 30 minutes, but still above occurs sporadically.

I've had contact with Microsoft and they tell me your package only supports en-US which causes the exception. To my surprise the exception wasn't thrown any longer once the language on that same device was changed to en-US.
How is this possible? Isn't the default language used as a fallback when my device's language isn't found?

NullReferenceException in Transport.TcpTransport when there is no internet connection

I am using this library through the service bus SDK for Xamarin.Android and when I turn my internet connection off, I get an endless loop of exceptions with the following stacktrace:

{System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.Azure.Amqp.Transport.TcpTransport..ctor (System.Net.Sockets.Socket socket, Microsoft.Azure.Amqp.Transport.TcpTransportSettings transportSettings) [0x0004c] in <…}

  at Microsoft.Azure.Amqp.Transport.TcpTransport..ctor (System.Net.Sockets.Socket socket, Microsoft.Azure.Amqp.Transport.TcpTransportSettings transportSettings) [0x0004c] in <3b45427d81d44b4aa3f01d405febfb3f>:0 
  at Microsoft.Azure.Amqp.Transport.TcpTransportInitiator.Complete (System.Net.Sockets.SocketAsyncEventArgs e, System.Boolean completeSynchronously) [0x00040] in <3b45427d81d44b4aa3f01d405febfb3f>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.ServiceBusConnection+<CreateConnectionAsync>d__44.MoveNext () [0x00090] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\ServiceBusConnection.cs:225 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.Amqp.FaultTolerantAmqpObject`1+<OnCreateAsync>d__6[T].MoveNext () [0x00077] in <3b45427d81d44b4aa3f01d405febfb3f>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.Amqp.Singleton`1+<GetOrCreateAsync>d__13[TValue].MoveNext () [0x00154] in <3b45427d81d44b4aa3f01d405febfb3f>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.Amqp.Singleton`1+<GetOrCreateAsync>d__13[TValue].MoveNext () [0x001fc] in <3b45427d81d44b4aa3f01d405febfb3f>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.Amqp.AmqpLinkCreator+<CreateAndOpenAmqpLinkAsync>d__11.MoveNext () [0x00070] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Amqp\AmqpLinkCreator.cs:41 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.Core.MessageReceiver+<CreateLinkAsync>d__101.MoveNext () [0x00188] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:1535 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.Amqp.FaultTolerantAmqpObject`1+<OnCreateAsync>d__6[T].MoveNext () [0x00077] in <3b45427d81d44b4aa3f01d405febfb3f>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.Amqp.Singleton`1+<GetOrCreateAsync>d__13[TValue].MoveNext () [0x00154] in <3b45427d81d44b4aa3f01d405febfb3f>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.Amqp.Singleton`1+<GetOrCreateAsync>d__13[TValue].MoveNext () [0x001fc] in <3b45427d81d44b4aa3f01d405febfb3f>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.Core.MessageReceiver+<OnReceiveAsync>d__86.MoveNext () [0x002c5] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:1068 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.Core.MessageReceiver+<>c__DisplayClass64_0+<<ReceiveAsync>b__0>d.MoveNext () [0x00038] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:375 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.RetryPolicy+<RunOperation>d__20.MoveNext () [0x00171] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\RetryPolicy.cs:83 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.RetryPolicy+<RunOperation>d__20.MoveNext () [0x002bc] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\RetryPolicy.cs:108 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.Core.MessageReceiver+<ReceiveAsync>d__64.MoveNext () [0x001e2] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:389 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.Core.MessageReceiver+<ReceiveAsync>d__62.MoveNext () [0x0002f] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Core\MessageReceiver.cs:323 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.Azure.ServiceBus.MessageReceivePump+<MessagePumpTaskAsync>d__11.MoveNext () [0x000ee] in C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\MessageReceivePump.cs:64 

Tested on multiple devices with different Android versions
Targeting Android API level 28

=== Visual Studio Enterprise 2019 Preview for Mac ===

Version 8.0 Preview (8.0 build 2624)
Installation UUID: e1324239-09f8-4ef0-841d-818a176fdfbd
	GTK+ 2.24.23 (Raleigh theme)
	Xamarin.Mac 5.6.0.2 (d16-0 / 040682909)

	Package version: 518000268

=== Mono Framework MDK ===

Runtime:
	Mono 5.18.0.268 (2018-08/68aad3b0eb7) (64-bit)
	Package version: 518000268

=== NuGet ===

Version: 4.8.0.5385

=== .NET Core ===

Runtime: /usr/local/share/dotnet/dotnet
Runtime Versions:
	2.2.0
	2.1.2
	2.1.1
	2.1.0
	2.0.7
	2.0.5
SDK: /usr/local/share/dotnet/sdk/2.2.100/Sdks
SDK Versions:
	2.2.100
	2.1.302
	2.1.301
	2.1.300
	2.1.200
	2.1.4
MSBuild SDKs: /Library/Frameworks/Mono.framework/Versions/5.18.0/lib/mono/msbuild/15.0/bin/Sdks

=== Xamarin.Profiler ===

Version: 1.6.4
Location: /Applications/Xamarin Profiler.app/Contents/MacOS/Xamarin Profiler

=== Updater ===

Version: 11

=== Apple Developer Tools ===

Xcode 10.1 (14460.46)
Build 10B61

=== Xamarin.Mac ===

Version: 5.2.1.15 (Visual Studio Enterprise)
Hash: d60abd198
Branch: 
Build date: 2019-02-01 12:23:30-0500

=== Xamarin.iOS ===

Version: 12.2.1.15 (Visual Studio Enterprise)
Hash: d60abd198
Branch: d15-9
Build date: 2019-02-01 12:23:29-0500

=== Xamarin.Android ===

Version: 9.1.8.0 (Visual Studio Enterprise)
Android SDK: /Users/sam/Library/Android/sdk
	Supported Android versions:
		2.3   (API level 10)
		4.0.3 (API level 15)
		5.0   (API level 21)
		6.0   (API level 23)
		7.0   (API level 24)
		7.1   (API level 25)
		8.0   (API level 26)
		8.1   (API level 27)

SDK Tools Version: 26.1.1
SDK Platform Tools Version: 28.0.1
SDK Build Tools Version: 28.0.3

=== Microsoft Mobile OpenJDK ===

Java SDK: /Users/sam/Library/Developer/Xamarin/jdk/microsoft_dist_openjdk_8.0.25
1.8.0-25
Android Designer EPL code available here:
https://github.com/xamarin/AndroidDesigner.EPL

=== Android Device Manager ===

Version: 1.2.0.13
Hash: ec487ee
Branch: remotes/origin/d16-0
Build date: 2019-02-28 22:03:50 UTC

=== Xamarin Designer ===

Version: 4.17.4.366
Hash: b4b7c658d
Branch: remotes/origin/d16-0
Build date: 2019-02-18 13:35:26 UTC

=== Xamarin Inspector ===

Version: 1.4.3
Hash: db27525
Branch: 1.4-release
Build date: Mon, 09 Jul 2018 21:20:18 GMT
Client compatibility: 1

=== Build Information ===

Release ID: 800002624
Git revision: 2efed6c01e4a62b8adc3b048a68f792390c894a0
Build date: 2019-03-04 18:20:21+00
Build branch: master
Xamarin extensions: 6457d5033f37b53ae852bd388eed15a30c8e86eb

=== Operating System ===

Mac OS X 10.14.3
Darwin 18.2.0 Darwin Kernel Version 18.2.0
    Thu Dec 20 20:46:53 PST 2018
    root:xnu-4903.241.1~1/RELEASE_X86_64 x86_64

NullReferenceException in AmqpLink.CompleteDelivery

We use Azure-amqp in Azure IoT Edge for the AMQP protocol head. In one scenario, when the server is sending messages to a client, we sometimes get a NullReferenceException in AmqpLink.CompleteDelivery.

Here is the stack trace and some relevant logs from the Amqp library -

AmqpLogOperationVerbose=time: 12/05/2018 03:02:23, source: in-connection63, operation: Send, detail: FRM(0000|2|0|00 end(error:error(condition:amqp:internal-error,description:An
AMQP error occurred (condition='amqp:internal-error').,info:[exception:System.NullReferenceException: Object reference not set to an instance of an object.
at Microsoft.Azure.Amqp.AmqpLink.CompleteDelivery(ArraySegment`1 deliveryTag) in E:\workspace\azure-amqp\Microsoft.Azure.Amqp\Amqp\AmqpLink.cs:line 381
at Microsoft.Azure.Amqp.AmqpLink.OnDisposeDelivery(Delivery delivery) in E:\workspace\azure-amqp\Microsoft.Azure.Amqp\Amqp\AmqpLink.cs:line 357
at Microsoft.Azure.Amqp.AmqpSession.SessionChannel.OnReceiveDisposition(Disposition disposition) in E:\workspace\azure-amqp\Microsoft.Azure.Amqp\Amqp\AmqpSession.cs:line 670
at Microsoft.Azure.Amqp.AmqpSession.OnReceiveDisposition(Disposition disposition) in E:\workspace\azure-amqp\Microsoft.Azure.Amqp\Amqp\AmqpSession.cs:line 404
at Microsoft.Azure.Amqp.AmqpSession.ProcessFrame(Frame frame) in E:\workspace\azure-amqp\Microsoft.Azure.Amqp\Amqp\AmqpSession.cs:line 150])))
AmqpLogOperationVerbose=time: 12/05/2018 03:02:23, source: in-connection63, operation: Receive, detail: FRM(0011|2|0|00 detach(handle:0,closed:True))
AmqpLinkDetach=time: 12/05/2018 03:02:23, source: receiver68, name: 7d7a8d237cc5400da2a0764452172b16, handle: 0, action: R:DETACH, error:
AmqpStateTransition=time: 12/05/2018 03:02:23, source: receiver68, operation: R:DETACH, fromState: CloseSent, toState: End

On digging deeper, it looks like the object delivery is null on this line -

this.DisposeDelivery(delivery, true, delivery.State);

A potential fix for this would be to lock with the syncRoot around the read of the unsettledMap, just like the write/remove operations are.

Exception when trying to access the Extensions property of AmqpConnection

We are using Microsoft.Azure.ServiceBus 3.1.1 which has a dependency on 2.3.5 of this package. We see a lot of exceptions in our logs with the following stacktrace:

System.MissingMemberException: The lazily-initialized type does not have a public, parameterless constructor.

System.Threading
LazyHelpers`1[T].ActivatorFactorySelector ()
System.Threading
LazyInitializer.EnsureInitializedCore[T] (T& target, System.Func`1[TResult] valueFactory)
System.Threading
LazyInitializer.EnsureInitialized[T] (T& target)
Microsoft.Azure.Amqp
AmqpConnection.get_Extensions ()
Microsoft.Azure.Amqp.AmqpCbsLink
Microsoft.Azure.Amqp.AmqpCbsLink..ctor (Microsoft.Azure.Amqp.AmqpConnection connection) <0xc11a15f8 + 0x0016b> in <6bfda9722f4141459de74030a02ccb61>:0
Microsoft.Azure.ServiceBus
ServiceBusConnection+<CreateConnectionAsync>d__44.MoveNext ()
Microsoft.Azure.Amqp
FaultTolerantAmqpObject`1+<OnCreateAsync>d__6[T].MoveNext ()
Microsoft.Azure.Amqp
Singleton`1+<GetOrCreateAsync>d__13[TValue].MoveNext ()
Microsoft.Azure.Amqp
Singleton`1+<GetOrCreateAsync>d__13[TValue].MoveNext ()
Microsoft.Azure.ServiceBus.Amqp
AmqpLinkCreator+<CreateAndOpenAmqpLinkAsync>d__11.MoveNext ()
Microsoft.Azure.ServiceBus.Core
MessageReceiver+<CreateLinkAsync>d__101.MoveNext ()
Microsoft.Azure.Amqp
FaultTolerantAmqpObject`1+<OnCreateAsync>d__6[T].MoveNext ()
Microsoft.Azure.Amqp
Singleton`1+<GetOrCreateAsync>d__13[TValue].MoveNext ()
Microsoft.Azure.Amqp
Singleton`1+<GetOrCreateAsync>d__13[TValue].MoveNext ()
Microsoft.Azure.ServiceBus.Core
MessageReceiver+<OnReceiveAsync>d__86.MoveNext ()
Microsoft.Azure.ServiceBus.Core
MessageReceiver+<>c__DisplayClass64_0+<<ReceiveAsync>b__0>d.MoveNext ()
Microsoft.Azure.ServiceBus
RetryPolicy+<RunOperation>d__20.MoveNext ()
Microsoft.Azure.ServiceBus
RetryPolicy+<RunOperation>d__20.MoveNext ()
Microsoft.Azure.ServiceBus.Core
MessageReceiver+<ReceiveAsync>d__64.MoveNext ()
Microsoft.Azure.ServiceBus.Core
MessageReceiver+<ReceiveAsync>d__62.MoveNext ()
Microsoft.Azure.ServiceBus
MessageReceivePump+<MessagePumpTaskAsync>d__11.MoveNext ()

image

Preliminary research leads to this line: https://github.com/Azure/azure-amqp/blob/v2.3.5/Microsoft.Azure.Amqp/Amqp/AmqpConnection.cs#L89

I don't see why this exception would occur since the constructor exists.

We get the exception in the exceptionReceivedHandler of the MessageHandlerOptions class. This is the code we are using:

                var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(connectionStringDto.Data.SASToken);
                _messageReceiver = new SubscriptionClient(connectionStringDto.Data.Endpoint, connectionStringDto.Data.TopicPath, connectionStringDto.Data.SubscriptionName, tokenProvider);
                
                var messageHandlerOptions = new MessageHandlerOptions(ExceptionReceived) {MaxConcurrentCalls = 1, AutoComplete = false};
                _messageReceiver.RegisterMessageHandler(ProcessMessage, messageHandlerOptions);

Memory leak

I have setup a bench to test a very high throughput to Azure Service Bus and it seems there is an issue regarding sending batch messages to entry point method:
Task<Outcome> SendMessageAsync(AmqpMessage message, ArraySegment<byte> deliveryTag, ArraySegment<byte> txnId, TimeSpan timeout)

Basically my code looks like this and I use azure-service-bus-dotnet to wire-up AMQP:

private async Task SendPartitionedBatchAsync(IEnumerable<Message> messages)
{
    var batch = new List<Message>();
    long batchSize = 0;

    foreach (var message in messages)
    {
        if ((batchSize + message.Size) > Helpers.ServiceBusOptions.MaxServiceBusBatchSizeInBytes)
        {
            await QueueClient.SendAsync(batch);

            batch = new List<Message> {message};
            batchSize = message.Size;
        }
        else
        {
            batch.Add(message);
            batchSize += message.Size;
        }
    }

    await QueueClient.SendAsync(batch);
}

Here's the memory profile I see while using Visual Studio analyser:

capture

And GC will never collect the objects which are growing insanely fast.

AMQP encode/decode support

In the AMQP send/Kafka receive scenario, AMQP header values are returned to the Kafka consumer in AMQP encoding.

An encode/decode utility from this package would be valuable in the above scenario (e.g. users running Kafka consumers on an IoT Hub's backing Event Hub).

Azure/azure-event-hubs-for-kafka#56

Sending events to EventHub using Xamarin.Android crashes without reasonable error

Actual Behavior

  1. Send events or any data to wrong AMQP endpoint (in our case incorrect EventHub endpoint or expired Signature)
  2. Get MissingManifestResourceException exception

Expected Behavior

  1. Should display correct error, unrelated to manifest resources

Versions

  • OS platform and version: MacOS
  • .NET Version: 2.0.0/Xamarin.Android
  • NuGet package version or commit ID: NuGet 2.1.2

Stack trace:

System.Resources.MissingManifestResourceException: Could not find any resources appropriate for the specified culture or the neutral culture.  Make sure "Microsoft.Azure.Amqp.Amqp.Resources.resources" was correctly embedded or linked into assembly "Microsoft.Azure.Amqp" at compile time, or that all the satellite assemblies required are loadable and fully signed.
  at System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing (System.String fileName) [0x000bf] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
  at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet (System.Globalization.CultureInfo culture, System.Collections.Generic.Dictionary`2[TKey,TValue] localResourceSets, System.Boolean tryParents, System.Boolean createIfNotExists, System.Threading.StackCrawlMark& stackMark) [0x000d9] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
  at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo requestedCulture, System.Boolean createIfNotExists, System.Boolean tryParents, System.Threading.StackCrawlMark& stackMark) [0x00099] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
  at System.Resources.ResourceManager.InternalGetResourceSet (System.Globalization.CultureInfo culture, System.Boolean createIfNotExists, System.Boolean tryParents) [0x00002] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
  at System.Resources.ResourceManager.GetString (System.String name, System.Globalization.CultureInfo culture) [0x0005a] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
  at Microsoft.Azure.Amqp.Amqp.Resources.get_AmqpPutTokenFailed () [0x00005] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.AmqpCbsLink+SendTokenAsyncResult.ConvertToException (System.Int32 statusCode, System.String statusDescription) [0x000c5] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.AmqpCbsLink+SendTokenAsyncResult+<GetAsyncSteps>d__13.MoveNext () [0x002bc] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.IteratorAsyncResult`1[TIteratorAsyncResult].MoveNextStep () [0x00000] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.IteratorAsyncResult`1[TIteratorAsyncResult].EnumerateSteps (Microsoft.Azure.Amqp.IteratorAsyncResult`1+CurrentThreadType[TIteratorAsyncResult] state) [0x0015f] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.IteratorAsyncResult`1[TIteratorAsyncResult].StepCallback (System.IAsyncResult result) [0x00057] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.AsyncResult.AsyncCompletionWrapperCallback (System.IAsyncResult result) [0x00037] in <0d8e42bc36144490846afcc73ae3b448>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
  at Microsoft.Azure.Amqp.ExceptionDispatcher.Throw (System.Exception exception) [0x00006] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.AsyncResult.End[TAsyncResult] (System.IAsyncResult result) [0x000f5] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.AsyncResult`1[TAsyncResult].End (System.IAsyncResult asyncResult) [0x00000] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.AmqpCbsLink.EndSendToken (System.IAsyncResult result) [0x00000] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at Microsoft.Azure.Amqp.AmqpCbsLink.<SendTokenAsync>b__8_1 (System.IAsyncResult a) [0x00000] in <0d8e42bc36144490846afcc73ae3b448>:0 
  at (wrapper delegate-invoke) System.Func`2[System.IAsyncResult,System.DateTime]:invoke_TResult_T (System.IAsyncResult)

While on Console app we get normal errors (401 or 401 or 404, depending on the case).

This is how Microsoft.Azure.Amqp.dll used for Android (from NuGet 2.1.2) looks like when exploring resources:

screenshot 2017-12-05 17 52 43

Note the resource names:

Microsoft.Azure.Amqp.Amqp.Amqp.Resources.resources
Microsoft.Azure.Amqp.Amqp.ResourcesGeneric.resources

MissingManifestResourceException mentions:

Microsoft.Azure.Amqp.Amqp.Resources.resources

Peek without locking use RequestResponseAmqpLink

QueueClient in Core doesn't expose peeking messages without locking....

Would this be possible by issuing a RequestResponseAmqpLink with request type as com.microsoft:peek-message (See https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-amqp-request-response)? Or is there another way to peek without locking? Questions are rooted in speeding up scanning dead-letter ONLY without issuing a lock-token (not intended for queues or subscriptions just dead-letter).

No deep understanding of AMPQ. If peeks without locks is allowed by the standard.

Transport.ClientWebSocketTransport.WriteAsyncCore fails in UWP applications

Repro:

  • Create a UWP C# application.
  • Add Microsoft.Azure.Devices.Client 1.20.1.
  • In MainPage.xaml, add a button to call OnTest().
  • In MainPage.xaml.cs,
using Microsoft.Azure.Devices.Client;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace TestSDK_UWP
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private async Task TestCallback(MethodRequest methodRequest, object userContext)
        {
            return new MethodResponse(200);
        }

        private async void Test()
        {
            _deviceClient = DeviceClient.CreateFromConnectionString("connections_tring",
                new ITransportSettings[]
                {
                    new AmqpTransportSettings(TransportType.Amqp_WebSocket_Only)
                    {
                        AmqpConnectionPoolSettings = new AmqpConnectionPoolSettings()
                    }
                });
            await _deviceClient.SetMethodHandlerAsync("TestMethod", TestCallback, null);
        }

        private void OnTest(object sender, RoutedEventArgs e)
        {
            Test();
        }

        DeviceClient _deviceClient;
    }
}

Run the application on the desktop and invoke OnTest().

Actual:

   at Microsoft.Azure.Amqp.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at Microsoft.Azure.Amqp.AmqpObject.OpenAsyncResult.End(IAsyncResult result)
   at Microsoft.Azure.Amqp.AmqpObject.EndOpen(IAsyncResult result)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Azure.Devices.Client.Transport.Amqp.AmqpConnector.OpenConnectionAsync(TimeSpan timeout)
   at Microsoft.Azure.Devices.Client.Transport.Amqp.AmqpConnectionHolder.EnsureConnection(TimeSpan timeout)
   at Microsoft.Azure.Devices.Client.Transport.Amqp.AmqpConnectionHolder.AmqpSessionCreator(DeviceIdentity deviceIdentity, ILinkFactory linkFactory, AmqpSessionSettings amqpSessionSettings, TimeSpan timeout)
   at Microsoft.Azure.Devices.Client.Transport.Amqp.AmqpUnit.OpenAsync(TimeSpan timeout)
   at Microsoft.Azure.Devices.Client.Transport.Amqp.AmqpTransportHandler.OpenAsync(CancellationToken cancellationToken)
   at Microsoft.Azure.Devices.Client.Transport.ProtocolRoutingDelegatingHandler.OpenAsync(CancellationToken cancellationToken)
   at Microsoft.Azure.Devices.Client.Transport.ErrorDelegatingHandler.<>c__DisplayClass22_0.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Azure.Devices.Client.Transport.ErrorDelegatingHandler.ExecuteWithErrorHandlingAsync[T](Func`1 asyncOperation)
   at Microsoft.Azure.Devices.Client.Transport.RetryDelegatingHandler.<>c__DisplayClass32_0.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Azure.Devices.Client.Transport.RetryDelegatingHandler.EnsureOpenedAsync(CancellationToken cancellationToken)
   at Microsoft.Azure.Devices.Client.Transport.RetryDelegatingHandler.<>c__DisplayClass19_0.<b__0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Azure.Devices.Client.Transport.RetryDelegatingHandler.EnableMethodsAsync(CancellationToken cancellationToken)
   at Microsoft.Azure.Devices.Client.InternalClient.SetMethodHandlerAsync(String methodName, MethodCallback methodHandler, Object userContext, CancellationToken cancellationToken)
   at Microsoft.Azure.Devices.Client.InternalClient.SetMethodHandlerAsync(String methodName, MethodCallback methodHandler, Object userContext)
   at TestSDK_UWP.MainPage.Test()

Microsoft.Azure.Amqp.Transport.ClientWebSocketTransport.WriteAsyncCore

lock contention is extremely high when the request rate is high

Timer is used by many functions in the library. What we found is if the request rate is very high, around 30% of CPU is for lock contention. Is there a way to optimize? I know the issue with Timer is fixed in .net core and HashedWheelTimer is implemented in dotnetty.

Add support for Xamarin Sdk and User Assemblies linking

When I changed Linking configuration in Xamarin Android to 'Sdk and User Assemblies' I had 'MissingMemberException' exception in AmqpCbsLink class. I just added [Preserve(AllMembers = true)] attribute to the class and it fixed.

Getting an exception that System.ICloneable can not be loaded

We're using Microsoft.Azure.Devices and Microsoft.Azure.Devices.Client. When sending messages in batch to IOTHub (using SendEventBatchAsync) using the AMQP protocol on the client object (Azure.Devices.Client.DeviceClient), we're getting an exception on Azure.AMQP:

{System.TypeInitializationException: The type initializer for 'Microsoft.Azure.Devices.Client.SerializationUtilities' threw an exception. ---> System.TypeLoadException: Could not load type 'System.ICloneable' from assembly 'Microsoft.Azure.Amqp, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
at Microsoft.Azure.Devices.Client.SerializationUtilities..cctor()
--- End of inner exception stack trace ---
at Microsoft.Azure.Devices.Client.DeviceClient.<>c__DisplayClass73_0.b__2(Task t)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at functions.Domain.DeviceTwinManager.d__3.MoveNext() in P:\jb\Sitech SAHC 2.0 Azure\sahc-poc\functions\Domain\DeviceTwinManager.cs:line 73} System.Exception {System.TypeInitializationException}

The AMQP library should not define .NET Framework types: ICloneable

Getting the following error if I compile an UWP 16299 application also importing AMQP:

Error	CS0433	The type 'ICloneable' exists in both 'Microsoft.Azure.Amqp, Version=2.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' and 'System.Runtime, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

The code is in: https://github.com/Azure/azure-amqp/blob/bb20e964c18fb737f801d2584ae9b6cabd55060e/Microsoft.Azure.Amqp/PlatformSupport.cs

Exception receiving messages from Azure Service Bus in Xamarin.iOS

I'm using the new Azure Service Bus component which is available here: https://github.com/azure/azure-service-bus-dotnet

When running this package in .NET Core 1.1, the message is received absolutely fine. Using the same code in Xamarin.iOS, it throws an exception on receive.

{System.InvalidOperationException: Operation is not valid due to the current state of the object.
at Microsoft.Azure.Amqp.Transport.TransportStream.Write (System.Byte[] buffer, System.Int32 offset, System.Int32 count) [0x00001] in :0
at Mono.Net.Security.MobileAuthenticatedStream.InnerFlush () [0x0000e] in

Forced batching by SendingAmqpLink even when queue doesn't support batching

We have a service bus queue with partitioning and duplication detection enabled, we are using MessageSender (with Amqp) and send multiple messages using just single message SendAsync (so no intentional batching). And we get the exception:
System.InvalidOperationException: Batching brokered messages with distinct SessionId, PartitionKey, or MessageId is not supported for an entity with partitioning and duplicate detection enabled.

Is there a way to force SendingAmqpLink to not batch?

Don't introduce root namespace "Platform"

Background
Adding Microsoft.Azure.Amqp NuGet package to an existing project.

Problem
The package introduces a root namespace "Platform" (essentially only Platform.System.Text), which results in some name clashes for us.

Expected behavior
No such root namespace, especially since it feels unneeded.

Either place the System.Text.Encoding wrapping that is done in PlatformSupport.cs somewhere in the Microsoft.Azure.Amqp namespace, or directly use System.Text.Encoding with the corresponding directives.

Add support for netstandard2.0

Microsoft.Azure.Devices.Client fails with MissingMethodException for the following configuration:

OS, version, SKU and CPU architecture used: Windows10 Enterprise (1803) x64
Application's .NET Target Framework : UWP version 17134, Microsoft.NETCore.UniversalWindowsPlatform 6.1.7

REF: Azure/azure-iot-sdk-csharp#610 (comment)

This is caused by lack of netstandard2.0 / UAP 16299 support.

System.InvalidOperationException

Actual Behavior

  1. When I try to send a message using Xamarin Forms for Android on the 4G network O received the following exception:
Unhandled Exception:

System.InvalidOperationException: An attempt was made to transition a task to a final state when it had already completed.

02-07 13:58:29.540 E/mono    ( 1123): 
02-07 13:58:29.540 E/mono    ( 1123): Unhandled Exception:
02-07 13:58:29.540 E/mono    ( 1123):   at System.Threading.Tasks.TaskCompletionSource`1[TResult].SetException (System.Exception exception) [0x00021] in <657aa8fea4454dc898a9e5f379c58734>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at Microsoft.Azure.Amqp.Transport.AmqpTransportInitiator+<>c__DisplayClass15_0.<ConnectTaskAsync>b__0 (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs a) [0x00014] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at Microsoft.Azure.Amqp.Transport.AmqpTransportInitiator.Complete (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs args) [0x00076] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at Microsoft.Azure.Amqp.Transport.AmqpTransportInitiator.OnConnectComplete (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs args) [0x00008] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at Microsoft.Azure.Amqp.Transport.TlsTransportInitiator.Complete () [0x00059] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at Microsoft.Azure.Amqp.Transport.TlsTransportInitiator.HandleInnerTransportConnected (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs innerArgs) [0x0002a] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at Microsoft.Azure.Amqp.Transport.TlsTransportInitiator.OnInnerTransportConnected (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs innerArgs) [0x00006] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at Microsoft.Azure.Amqp.Transport.TcpTransportInitiator.Complete (System.Net.Sockets.SocketAsyncEventArgs e, System.Boolean completeSynchronously) [0x000a4] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at Microsoft.Azure.Amqp.Transport.TcpTransportInitiator.OnConnectComplete (System.Object sender, System.Net.Sockets.SocketAsyncEventArgs e) [0x00026] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted (System.Net.Sockets.SocketAsyncEventArgs e) [0x0000e] in <10a067eff09446018662189377d200e9>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at System.Net.Sockets.SocketAsyncEventArgs.Complete () [0x00000] in <10a067eff09446018662189377d200e9>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at System.Net.Sockets.Socket+<>c.<.cctor>b__307_3 (System.IAsyncResult ares) [0x00057] in <10a067eff09446018662189377d200e9>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at System.Net.Sockets.SocketAsyncResult+<>c.<Complete>b__27_0 (System.Object state) [0x0000b] in <10a067eff09446018662189377d200e9>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x00008] in <657aa8fea4454dc898a9e5f379c58734>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00074] in <657aa8fea4454dc898a9e5f379c58734>:0 
02-07 13:58:29.540 E/mono    ( 1123):   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in <657aa8fea4454dc898a9e5f379c58734>:0 
02-07 13:58:29.552 E/mono-rt ( 1123): [ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidOperationException: An attempt was made to transition a task to a final state when it had already completed.
02-07 13:58:29.552 E/mono-rt ( 1123):   at System.Threading.Tasks.TaskCompletionSource`1[TResult].SetException (System.Exception exception) [0x00021] in <657aa8fea4454dc898a9e5f379c58734>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at Microsoft.Azure.Amqp.Transport.AmqpTransportInitiator+<>c__DisplayClass15_0.<ConnectTaskAsync>b__0 (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs a) [0x00014] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at Microsoft.Azure.Amqp.Transport.AmqpTransportInitiator.Complete (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs args) [0x00076] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at Microsoft.Azure.Amqp.Transport.AmqpTransportInitiator.OnConnectComplete (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs args) [0x00008] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at Microsoft.Azure.Amqp.Transport.TlsTransportInitiator.Complete () [0x00059] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at Microsoft.Azure.Amqp.Transport.TlsTransportInitiator.HandleInnerTransportConnected (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs innerArgs) [0x0002a] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at Microsoft.Azure.Amqp.Transport.TlsTransportInitiator.OnInnerTransportConnected (Microsoft.Azure.Amqp.Transport.TransportAsyncCallbackArgs innerArgs) [0x00006] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at Microsoft.Azure.Amqp.Transport.TcpTransportInitiator.Complete (System.Net.Sockets.SocketAsyncEventArgs e, System.Boolean completeSynchronously) [0x000a4] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at Microsoft.Azure.Amqp.Transport.TcpTransportInitiator.OnConnectComplete (System.Object sender, System.Net.Sockets.SocketAsyncEventArgs e) [0x00026] in <e78a4bf854a74cf694a80dd8f7bbcafb>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted (System.Net.Sockets.SocketAsyncEventArgs e) [0x0000e] in <10a067eff09446018662189377d200e9>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at System.Net.Sockets.SocketAsyncEventArgs.Complete () [0x00000] in <10a067eff09446018662189377d200e9>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at System.Net.Sockets.Socket+<>c.<.cctor>b__307_3 (System.IAsyncResult ares) [0x00057] in <10a067eff09446018662189377d200e9>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at System.Net.Sockets.SocketAsyncResult+<>c.<Complete>b__27_0 (System.Object state) [0x0000b] in <10a067eff09446018662189377d200e9>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x00008] in <657aa8fea4454dc898a9e5f379c58734>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00074] in <657aa8fea4454dc898a9e5f379c58734>:0 
02-07 13:58:29.552 E/mono-rt ( 1123):   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in <657aa8fea4454dc898a9e5f379c58734>:0 

Here is my code:

private TopicClient client;

public async Task SendAsync(T item, Dictionary<string, object> properties)
        {
            var json = JsonConvert.SerializeObject(item);
            var message = new Message(Encoding.UTF8.GetBytes(json));

            if (properties != null)
            {
                foreach (var prop in properties)
                {
                    message.UserProperties.Add(prop.Key, prop.Value);
                }
            }

            await client.SendAsync(message);
        }

This is weird because this issue only happens when I try to deploy on a real device that's not connected on a WI-FI network. The same issue not happens on on Android Simulator.

Expected Behavior

  1. Work in 4G network.

Versions

  • OS platform and version: Android 7.1 (Samsung Note8)
  • .NET Version: Xamarin Android 8.0
  • NuGet package version or commit ID: 2.1.3

ReceivingAmqpLink.DisposeMessage disposes incorrect messages

In my app, the client receives messages from the server over the ReceivingAmqpLink. Each received message is then Accepted by the client, by calling ReceivingAmqpLink.DisposeMessageAsync with the delivery tag.
However, if multiple messages are received before the first one is Disposed, then only one delivery message is sent to the server. For example, here is the order of events -

  • Receive message A
  • Receive message B
  • Dispose message A
  • Dispose message B (server doesn't get this delivery at this time)
  • Receive message C
  • Dispose message C (server gets delivery of message B!)
  • Receive message D
  • Dispose message D (server gets delivery of Message C!)

Is the 1st message required to be disposed before the 2nd message is received over one link? Is the above a valid scenario (and possibly a bug in the library), or should the messages only come in order?

Using AmqpMessage to build up gradually a collection

AmqpMessage exposes a factory method Create(IEnumerable<Data>) to create AmqpMessage with multiple Datas. Is it possible to build up an AmqpMessage iteratively, rather than providing an entire collection of Data objects?

UWP applications to Send/Receive seems to be broken with Version 2.1.0

When attempting Universal Windows Platform Send/Receive application using Microsoft.Azure.ServiceBus library which inturn references Microsoft.Azure.Amqp library version 2.1.0, we get the following error during the first send/receive

System.InvalidOperationException: A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)

TcpTransportInitiator compatibility issue with .net standard

The following code failing when run from AWS lambda:

#if MONOANDROID
// Work around for Mono issue: https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/171
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
bool connectResult = socket.ConnectAsync(connectEventArgs);
#else
// On Linux platform, socket connections are allowed to be initiated on the socket instance
// with hostname due to multiple IP address DNS resolution possibility.
// They suggest either using static Connect API or IP address directly.
bool connectResult = Socket.ConnectAsync(SocketType.Stream, ProtocolType.Tcp, connectEventArgs);
#endif

But, when I use the monoandroid build (in my .net core application) it works correctly when running from AWS lambda. The issue is the call to Socket.ConnectAsync eventually calls to here:
MultipleSocketMultipleConnectAsync > Socket.OSSupportsIPv4 > Socket.InitializeSockets > UnsafeNclNativeMethods.OSSOCK.WSAStartup

Pretty sure this last method is failing. Workaround to failback to using ipv4 AddressFamily when the non-monoandroid statement fails?

https://github.com/Microsoft/referencesource/blob/b31308b03e8bd5bf779fb80fda71f31eb959fe0b/System/net/System/Net/Sockets/_MultipleConnectAsync.cs#L425

https://github.com/Microsoft/referencesource/blob/b31308b03e8bd5bf779fb80fda71f31eb959fe0b/System/net/System/Net/Sockets/Socket.cs#L5980

APM vs TPL

Currently the library is implemented using APM. Any plans for adopting TPL? Thank you.

AmqpObject.State should be thread safe

AmqpObject.State currently is a property on the object which is used to to implement methods like IsClosed(). Unless these are thread safe, they might not return the latest value. One of volatile/interlocked/lock should be used for this property.
Similar to Azure/azure-service-bus-dotnet#297

Sample code where this becomes an issue:

while (timeoutHelper.RemainingTime() > TimeSpan.Zero)
{
	IEnumerable<AmqpMessage> amqpMessages = null;
	var hasMessages = await Task.Factory.FromAsync(
		(c, s) => receiveLink.BeginReceiveRemoteMessages(maxMessageCount, DefaultBatchFlushInterval, timeoutHelper.RemainingTime(), c, s),
		a => receiveLink.EndReceiveMessages(a, out amqpMessages),
		this).ConfigureAwait(false);
	Exception exception;
	if ((exception = receiveLink.GetInnerException()) != null)
	{
		throw exception;
	}

	if (receiveLink.IsClosing())
	{
		break;
	}
}

In the above case, receiveLink.IsClosing() will not return true if the link (through linkManager) is closed on a different thread.

Calling AMPQLite's TestAmqpBroker

Using 2.1.3 of Azure AMQP on dotnet 2.1.4 (Windows 10)

Not well versed in the AMQP protocol and what brokers Microsoft's AMQP supports but thought I could run local broker TestAmqpBroker from AMQP Lite. Trying the following setup:

 var transportSettings = new TcpTransportSettings() {
   Host = "127.0.0.1",
   Port = 5672
 };

 var settings = new Microsoft.Azure.Amqp.AmqpSettings();

 AmqpTransportProvider amqpProvider = new AmqpTransportProvider();
 amqpProvider.Versions.Add(new AmqpVersion(new Version(1, 0, 0, 0)));
 settings.TransportProviders.Add(amqpProvider);

 AmqpTransportInitiator initiator = new AmqpTransportInitiator(settings, transportSettings);
  TransportBase transport = await Task.Factory.FromAsync(
            (c, s) => initiator.BeginConnect(AmqpConstants.DefaultTimeout, c, s),
            (r) => initiator.EndConnect(r),
            null)
            .ConfigureAwait(false);

 AmqpConnectionSettings connectionSettings = new AmqpConnectionSettings()
 {
    ContainerId = Guid.NewGuid().ToString(),
    MaxFrameSize = 65536,
    HostName = "127.0.0.1"
 };

 AmqpConnection connection = new AmqpConnection(
   transport, 
   ProtocolHeader.Amqp100, 
   false, 
   settings, 
   connectionSettings
 );
 await connection.OpenAsync(AmqpConstants.DefaultTimeout).ConfigureAwait(false);

Fails on handling the max frame size from the test broker which is set to 65536 but the AsyncIO receives 1095586128. Not sure where 1095586128 comes from. But thinking that the response form TestAmqpBroker on open isn't getting parsed correctly thus yielding an incorrect frame size to the HandleFrameSizeReadComplete handler.

Wondering first if talking with another AMPQ broker other than an Azure is possible and if I can configuring the underlying connection wrong? By the way, the initiator is flagged to false. If it is true then the connection closes immediately.

Background handshaking in the session and links

This is a question in relation to requests captured by the Azure Service Bus metrics in the Azure portal. Question might have been more suitable for the AMQP Azure client issues but giving a swing here since I think what I see in the pix below is more low-level. There is constant background chatter when no messages are coming in or out of the bus (i.e. same namespace). Chatter (i.e. requests) is with topic entities (about 8) that have 2-5 subscriptions each. Was expecting little background "noise" with AMQP. Thought the whole idea was that receivers dished out credits that senders used when sending and this type of exchange would mitigate the need for polling. Obviously wrong. Not expecting anybody here to elaborate on the inner works of the Azure's AMQP just point what types of oscillating requests are being made (i.e. from the session, individual links, etc. and why).

Thanks in advance / Matthew

image

Microsoft.Azure.EventHubs 2.2.1 not compatible with Microsoft.Azure.Amqp 2.4.1

I am running on .Net 4.7.2 with Microsoft.Azure.EventHubs 2.2.1, Microsoft.Azure.EventHubs.Processors 2.2.1. When using Microsoft.Azure.Amqp 2.3.7 the below code succeeds but after upgrading amqp to 2.4.1 the code crashes.

EventProcessorHost.RegisterEventProcessorFactoryAsync(IEventProcessorFactory factory, EventProcessorOptions processorOptions)

Microsoft.Azure.EventHubs.Processor.EventProcessorConfigurationException: Encountered error while fetching the list of EventHub PartitionIds ---> System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Azure.Amqp, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
at Microsoft.Azure.EventHubs.Amqp.Management.AmqpServiceClient.d__8.MoveNext()
at Microsoft.Azure.EventHubs.Amqp.AmqpEventHubClient.d__25.MoveNext()
at Microsoft.Azure.EventHubs.EventHubClient.d__30.MoveNext()
at Microsoft.Azure.EventHubs.Processor.PartitionManager.d__6.MoveNext()
at Microsoft.Azure.EventHubs.Processor.PartitionManager.d__6.MoveNext()
at Microsoft.Azure.EventHubs.Processor.PartitionManager.d__6.MoveNext()
at Microsoft.Azure.EventHubs.Processor.PartitionManager.d__10.MoveNext()
at Microsoft.Azure.EventHubs.Processor.PartitionManager.d__7.MoveNext()
at Microsoft.Azure.EventHubs.Processor.EventProcessorHost.d__53.MoveNext()

Add missing functionality for UWP

  • OS, version, SKU and CPU architecture used: Windows10 Enterprise (1803) x64
  • Application's .NET Target Framework : UWP version 17134, Microsoft.NETCore.UniversalWindowsPlatform 6.1.7

Microsoft.Azure.Devices.ServiceClient fails with MissingMethodException (Method not found: 'Void Microsoft.Azure.Amqp.Transport.TlsTransportSettings.set_Certificate(System.Security.Cryptography.X509Certificates.X509Certificate2)')

REF Azure/azure-iot-sdk-csharp#610
REF Azure/azure-iot-sdk-csharp#612

Unobserved exception was rethrown by the finalizer thread

(moved from Azure/azure-event-hubs-dotnet#283)

Our telemetry is reporting heavy exception rate coming from AmqpConnection.AddSession(). The error is likely expected (race condition between closing partition receivers and recreating them it seems) but it gets reported by the finalizer thread so we cannot handle them. Could those be either caught in the Event Hub library or forwarded to the caller (our code)?

  • Inner Exception: System.InvalidOperationException Can't create session when the connection is closing.
  • Outer Exception: System.AggregateException A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property. As a result, the unobserved exception was rethrown by the finalizer thread. Can't create session when the connection is closing.

Inner Exception callstack:

System.InvalidOperationException:
   at Microsoft.Azure.Amqp.AmqpConnection.AddSession (Microsoft.Azure.Amqp, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at Microsoft.Azure.Amqp.AmqpCbsLink+OpenCbsRequestResponseLinkAsyncResult+<GetAsyncSteps>d__7.MoveNext (Microsoft.Azure.Amqp, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Microsoft.Azure.Amqp.AsyncResult.End (Microsoft.Azure.Amqp, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at Microsoft.Azure.Amqp.AmqpCbsLink.EndCreateCbsLink (Microsoft.Azure.Amqp, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Microsoft.Azure.Amqp.FaultTolerantAmqpObject`1+<OnCreateAsync>d__5.MoveNext (Microsoft.Azure.Amqp, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at Microsoft.Azure.Amqp.Singleton`1+<CreateValue>d__20.MoveNext (Microsoft.Azure.Amqp, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)

Actual Behavior

  1. Exception reported on finalizer thread

Expected Behavior

  1. Exception reported to caller code

Versions

  • OS platform and version: Windows 10
  • .NET Version: Microsoft.Azure.EventHubs
  • NuGet package version or commit ID: 2.0.0

.net framework 4.5

Hello,
Could this project be compiled against .net framework 4.5?

Greetings,
Gl3nn

Question: 5000 max inflight messages

Hi,

ages ago I've opened an issue on service bus repo, regarding the consumer stop processing messages:
Azure/azure-sdk-for-net#6450

The behavior we experienced is that when the message lock expires, and the message becomes visible again in the bus, the message is not removed from the protocol "in-flight" lists, and if the messages are never released the protocol eventually stops processing further messages after 5000 concurrent connections to subscriber entities have been reached (as per documentation).
I've attached a replica repo to the issue too.

My question is the following:
Is it an intended behavior that, if the message lock expires, the message is not dropped from the list on "in flight" messages/connection?

If that so, why an exception is not thrown as specified in the documentation when more than 5000 messages are requested (https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-quotas)

Subsequent receive requests are rejected, and an exception is received by the calling code. This quota applies to the combined number of concurrent receive operations across all subscriptions on a topic.

Note
The messages are not imperatively released .ReleaseAsync(), in case of an exception, in order to let the lock timeout expire before the message being visible again for re-processing. This also leverages the oob dequeue count and of course dead lettering after n failed attempts

Thanks

Handle count growing

We noticed that the handle count on our azure web app is continually growing:

image

After taking a full process dump and analyzing the retained objects we can see that the ServiceBusConnection has a TimedHeartBeat that creates TimerQueueTimer objects. We see that the number of these objects (2.8k in the screenshot) approximately matches the number of handles shown on the web app. A follow-up process dump showed a similar story (3k TimerQueueTimer objects and 3k handles).

image

We are following the best-practice guidelines and reusing the MessageSender objects (31 in total). It would be great to understand if there is a setting we can apply or a fix provided, thanks

Web Proxy Settings

I'm here because I'm trying to figure out how to use azure-service-bus-dotnet (in netcore) behind a web proxy.

My issue is that I would like to use HTTP with TLS, but I am behind an authenticating web proxy. I don't see how to configure e.g. the TlsTransport to work behind a web proxy. I came expecting to find a
WebRequest somewhere under the hood, but I see AMQP is lower level and has tight performance concerns.

Is there a way to configure TlsTransport such that it this AMQP library can be used in an enterprise env. with a proper web proxy?

Thanks!

DisposeAsyncResult does not timeout

I have an application that uses Azure-AMQP as a dependency of Microsoft.Azure.ServiceBus.

After receiving a message the functions ReceivingAmqpLink.BeginDisposeMessage, ReceivingAmqpLink.EndDisposeMessage are called with a timeout parameter passed to BeginDisposeMessage.
This creates a DisposeAsyncResult an which ignores the timeout parameter, failing to pass it to the End method.
This is causing my application to encounter an infinite wait on the End method.

If a change is made to the azure service bus; such as modifying the Lock Duration property, then the message dispose orchestration does not complete, importantly the ManaulResetEvent of the DisposeAsyncResult is never triggered.
This combined with the lack of timeout means my application will wait on,
protected static TAsyncResult End<TAsyncResult>(IAsyncResult result) where TAsyncResult : AsyncResult { ... asyncResult.manualResetEvent.WaitOne(); ... }

If the timeout parameter was passed to the WaitHandle, and an exception throw if the timeout expires it would be possible to signal my application that the service bus connection should be disposed and prevent the infinite wait that is occurring now.

.net core nuget

When you will build new nuget package for .net core please ?

Can't create session when the connection is closing

One of the partition reader throws System.InvalidOperationException: Can't create session when the connection is closing. This is not frequent but once in a while this error occurs for particular partition reader.

Implementation is done using this [https://www.konabos.com/blog/load-testing-the-azure-iot-hub]

Stack Trace:
at Microsoft.Azure.Amqp.AmqpConnection.AddSession(AmqpSession session, Nullable1 channel) at Microsoft.Azure.Amqp.AmqpCbsLink.OpenCbsRequestResponseLinkAsyncResult.<GetAsyncSteps>d__7.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.Azure.Amqp.AsyncResult.End[TAsyncResult](IAsyncResult result) at Microsoft.Azure.Amqp.AmqpCbsLink.EndCreateCbsLink(IAsyncResult result) at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promise, Boolean requiresSynchronization) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Azure.Amqp.FaultTolerantAmqpObject1.d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.Amqp.Singleton1.<GetOrCreateAsync>d__13.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Azure.Amqp.Singleton1.d__13.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.Amqp.TaskHelpers.EndAsyncResult(IAsyncResult asyncResult)
at Microsoft.Azure.Amqp.IteratorAsyncResult1.<>c.<CallTask>b__24_1(TIteratorAsyncResult thisPtr, IAsyncResult r) at Microsoft.Azure.Amqp.IteratorAsyncResult1.StepCallback(IAsyncResult result)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Azure.Amqp.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.Azure.Amqp.AmqpCbsLink.<>c__DisplayClass4_0.b__1(IAsyncResult a)
at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.EventHubs.Amqp.AmqpPartitionReceiver.d__15.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.Amqp.FaultTolerantAmqpObject1.<OnCreateAsync>d__6.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Azure.Amqp.Singleton1.d__13.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.Amqp.Singleton`1.d__13.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.EventHubs.Amqp.AmqpPartitionReceiver.d__13.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Azure.EventHubs.Amqp.AmqpPartitionReceiver.d__13.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.EventHubs.PartitionReceiver.d__36.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.EventHubs.Amqp.AmqpPartitionReceiver.d__19.MoveNext()

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.