コード例 #1
0
        public static async Task Main(string[] args)
        {
            // Create token provider so that we can use it at both management and runtime clients.
            TokenProvider tokenProvider = TokenProvider.CreateAzureActiveDirectoryTokenProvider(
                async(audience, authority, state) =>
            {
                IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(ClientId)
                                                     .WithAuthority(authority)
                                                     .WithClientSecret(ClientSecret)
                                                     .Build();

                var authResult = await app.AcquireTokenForClient(new string[] { $"{audience}/.default" }).ExecuteAsync();
                return(authResult.AccessToken);
            },
                ServiceAudience.EventHubsAudience,
                $"https://login.microsoftonline.com/{TenantId}");

            var eventHubName = "testeh-" + Guid.NewGuid().ToString();

            // Create NamespaceManger and EventHubClient with Azure Active Directory token provider.
            var ehUri            = new Uri($"sb://{EventHubNamespace}/");
            var namespaceManager = new NamespaceManager(ehUri, tokenProvider);
            var messagingFactory = MessagingFactory.Create(ehUri,
                                                           new MessagingFactorySettings()
            {
                TokenProvider = tokenProvider,
                TransportType = TransportType.Amqp
            });
            var ehClient = messagingFactory.CreateEventHubClient(eventHubName);

            // Create a new event hub.
            Console.WriteLine($"Creating event hub {eventHubName}");
            await namespaceManager.CreateEventHubAsync(eventHubName);

            // Send and receive a message.
            await SendReceiveAsync(ehClient);

            // Delete event hub.
            Console.WriteLine($"Deleting event hub {eventHubName}");
            await namespaceManager.DeleteEventHubAsync(eventHubName);

            Console.WriteLine("Press enter to exit");
            Console.ReadLine();
        }
コード例 #2
0
        private async void btnStart_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.Compare(btnStart.Text, Start, StringComparison.OrdinalIgnoreCase) == 0)
                {
                    // Change button text
                    btnStart.Text = Stop;

                    // Validate parameters
                    if (!ValidateParameters())
                    {
                        return;
                    }

                    // Create namespace manager
                    var namespaceUri     = ServiceBusEnvironment.CreateServiceUri("sb", txtNamespace.Text, string.Empty);
                    var tokenProvider    = TokenProvider.CreateSharedAccessSignatureTokenProvider(txtKeyName.Text, txtKeyValue.Text);
                    var namespaceManager = new NamespaceManager(namespaceUri, tokenProvider);

                    // Check if the event hub already exists, if not, create the event hub.
                    var eventHubDescription = await namespaceManager.EventHubExistsAsync(txtEventHub.Text) ?
                                              await namespaceManager.GetEventHubAsync(txtEventHub.Text) :
                                              await namespaceManager.CreateEventHubAsync(new EventHubDescription(txtEventHub.Text)
                    {
                        PartitionCount         = txtPartitionCount.IntegerValue,
                        MessageRetentionInDays = txtMessageRetentionInDays.IntegerValue
                    });

                    WriteToLog(string.Format(EventHubCreatedOrRetrieved, txtEventHub.Text));

                    // Check if the SAS authorization rule used by devices to send events to the event hub already exists, if not, create the rule.
                    var authorizationRule = eventHubDescription.
                                            Authorization.
                                            FirstOrDefault(r => string.Compare(r.KeyName,
                                                                               SenderSharedAccessKey,
                                                                               StringComparison.InvariantCultureIgnoreCase)
                                                           == 0) as SharedAccessAuthorizationRule;
                    if (authorizationRule == null)
                    {
                        authorizationRule = new SharedAccessAuthorizationRule(SenderSharedAccessKey,
                                                                              SharedAccessAuthorizationRule.GenerateRandomKey(),
                                                                              new[]
                        {
                            AccessRights.Send
                        });
                        eventHubDescription.Authorization.Add(authorizationRule);
                        await namespaceManager.UpdateEventHubAsync(eventHubDescription);
                    }

                    cancellationTokenSource = new CancellationTokenSource();
                    var serviceBusNamespace = txtNamespace.Text;
                    var eventHubName        = txtEventHub.Text;
                    var senderKey           = authorizationRule.PrimaryKey;
                    var status            = txtStatus.Text;
                    var eventInterval     = txtEventIntervalInMilliseconds.IntegerValue;
                    var minValue          = txtMinValue.IntegerValue;
                    var maxValue          = txtMaxValue.IntegerValue;
                    var cancellationToken = cancellationTokenSource.Token;

                    // Create one task for each device
                    for (var i = 1; i <= txtDeviceCount.IntegerValue; i++)
                    {
                        var deviceId = i;
                        #pragma warning disable 4014
                        #pragma warning disable 4014
                        Task.Run(async() =>
                        #pragma warning restore 4014
                        {
                            var deviceName = $"device{deviceId:000}";
                            var random     = new Random((int)DateTime.Now.Ticks);

                            if (radioButtonAmqp.Checked)
                            {
                                // The token has the following format:
                                // SharedAccessSignature sr={URI}&sig={HMAC_SHA256_SIGNATURE}&se={EXPIRATION_TIME}&skn={KEY_NAME}
                                var token = CreateSasTokenForAmqpSender(SenderSharedAccessKey,
                                                                        senderKey,
                                                                        serviceBusNamespace,
                                                                        eventHubName,
                                                                        deviceName,
                                                                        TimeSpan.FromDays(1));
                                WriteToLog(string.Format(SasToken, deviceId));

                                var messagingFactory = MessagingFactory.Create(ServiceBusEnvironment.CreateServiceUri("sb", serviceBusNamespace, ""), new MessagingFactorySettings
                                {
                                    TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(token),
                                    TransportType = TransportType.Amqp
                                });
                                WriteToLog(string.Format(MessagingFactoryCreated, deviceId));

                                // Each device uses a different publisher endpoint: [EventHub]/publishers/[PublisherName]
                                var eventHubClient = messagingFactory.CreateEventHubClient($"{eventHubName}/publishers/{deviceName}");
                                WriteToLog(string.Format(EventHubClientCreated, deviceId, eventHubClient.Path));

                                while (!cancellationToken.IsCancellationRequested)
                                {
                                    // Create random value
                                    var value = random.Next(minValue, maxValue + 1);

                                    // Create EventData object with the payload serialized in JSON format
                                    var payload = JsonConvert.SerializeObject(new Payload
                                    {
                                        Id     = deviceId,
                                        Name   = deviceName,
                                        Status = status,
                                        Value  = value
                                    });
                                    using (var eventData = new EventData(Encoding.UTF8.GetBytes(payload))
                                    {
                                        PartitionKey = deviceName
                                    })
                                    {
                                        // Create custom properties
                                        eventData.Properties.Add(DeviceId, deviceId);
                                        eventData.Properties.Add(DeviceName, deviceName);
                                        eventData.Properties.Add(DeviceLocation, status);
                                        eventData.Properties.Add(Value, value);

                                        // Send the event to the event hub
                                        await eventHubClient.SendAsync(eventData);
                                        WriteToLog(string.Format(EventSent, deviceId, deviceName, value));
                                    }

                                    // Wait for the event time interval
                                    Thread.Sleep(eventInterval);
                                }
                            }
                            else
                            {
                                // The token has the following format:
                                // SharedAccessSignature sr={URI}&sig={HMAC_SHA256_SIGNATURE}&se={EXPIRATION_TIME}&skn={KEY_NAME}
                                var token = CreateSasTokenForHttpsSender(SenderSharedAccessKey,
                                                                         senderKey,
                                                                         serviceBusNamespace,
                                                                         eventHubName,
                                                                         deviceName,
                                                                         TimeSpan.FromDays(1));
                                WriteToLog(string.Format(SasToken, deviceId));

                                // Create HttpClient object used to send events to the event hub.
                                var httpClient = new HttpClient
                                {
                                    BaseAddress = new Uri($"https://{serviceBusNamespace}.servicebus.windows.net/{eventHubName}/publishers/{deviceName}".ToLower())
                                };
                                httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", token);
                                httpClient.DefaultRequestHeaders.Add("ContentType", "application/json;type=entry;charset=utf-8");
                                WriteToLog(string.Format(HttpClientCreated, deviceId, httpClient.BaseAddress));

                                while (!cancellationToken.IsCancellationRequested)
                                {
                                    // Create random value
                                    var value = random.Next(minValue, maxValue + 1);

                                    // Create HttpContent
                                    var postContent = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new Payload
                                    {
                                        Id     = deviceId,
                                        Name   = deviceName,
                                        Status = status,
                                        Value  = value
                                    })));

                                    // Create custom properties

                                    postContent.Headers.Add(DeviceId, deviceId.ToString(CultureInfo.InvariantCulture));
                                    postContent.Headers.Add(DeviceName, deviceName);
                                    //postContent.Headers.Add(DeviceLocation, location);
                                    postContent.Headers.Add(Value, value.ToString(CultureInfo.InvariantCulture));

                                    try
                                    {
                                        var response = await httpClient.PostAsync(httpClient.BaseAddress + "/messages" + "?timeout=60" + ApiVersion, postContent, cancellationToken);
                                        response.EnsureSuccessStatusCode();
                                        WriteToLog(string.Format(EventSent, deviceId, deviceName, value));
                                    }
                                    catch (HttpRequestException ex)
                                    {
                                        WriteToLog(string.Format(SendFailed, deviceId, ex.Message));
                                    }
                                }
                            }
                        },
                                 cancellationToken).ContinueWith(t =>
#pragma warning restore 4014
                        #pragma warning restore 4014
                        {
                            if (t.IsFaulted && t.Exception != null)
                            {
                                HandleException(t.Exception);
                            }
                        }, cancellationToken);
                    }
                }
                else
                {
                    // Change button text
                    btnStart.Text = Start;
                    cancellationTokenSource?.Cancel();
                }
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
        }