{"id":"150c9f9e-a695-4bcd-9016-63b64cac6e25","shortId":"sDTPjG","kind":"skill","title":"azure-eventhub-dotnet","tagline":"Azure Event Hubs SDK for .NET.","description":"# Azure.Messaging.EventHubs (.NET)\n\nHigh-throughput event streaming SDK for sending and receiving events via Azure Event Hubs.\n\n## Installation\n\n```bash\n# Core package (sending and simple receiving)\ndotnet add package Azure.Messaging.EventHubs\n\n# Processor package (production receiving with checkpointing)\ndotnet add package Azure.Messaging.EventHubs.Processor\n\n# Authentication\ndotnet add package Azure.Identity\n\n# For checkpointing (required by EventProcessorClient)\ndotnet add package Azure.Storage.Blobs\n```\n\n**Current Versions**: Azure.Messaging.EventHubs v5.12.2, Azure.Messaging.EventHubs.Processor v5.12.2\n\n## Environment Variables\n\n```bash\nEVENTHUB_FULLY_QUALIFIED_NAMESPACE=<namespace>.servicebus.windows.net\nEVENTHUB_NAME=<event-hub-name>\n\n# For checkpointing (EventProcessorClient)\nBLOB_STORAGE_CONNECTION_STRING=<storage-connection-string>\nBLOB_CONTAINER_NAME=<checkpoint-container>\n\n# Alternative: Connection string auth (not recommended for production)\nEVENTHUB_CONNECTION_STRING=Endpoint=sb://<namespace>.servicebus.windows.net/;SharedAccessKeyName=...\n```\n\n## Authentication\n\n```csharp\nusing Azure.Identity;\nusing Azure.Messaging.EventHubs;\nusing Azure.Messaging.EventHubs.Producer;\n\n// Always use DefaultAzureCredential for production\nvar credential = new DefaultAzureCredential();\n\nvar fullyQualifiedNamespace = Environment.GetEnvironmentVariable(\"EVENTHUB_FULLY_QUALIFIED_NAMESPACE\");\nvar eventHubName = Environment.GetEnvironmentVariable(\"EVENTHUB_NAME\");\n\nvar producer = new EventHubProducerClient(\n    fullyQualifiedNamespace,\n    eventHubName,\n    credential);\n```\n\n**Required RBAC Roles**:\n- **Sending**: `Azure Event Hubs Data Sender`\n- **Receiving**: `Azure Event Hubs Data Receiver`\n- **Both**: `Azure Event Hubs Data Owner`\n\n## Client Types\n\n| Client | Purpose | When to Use |\n|--------|---------|-------------|\n| `EventHubProducerClient` | Send events immediately in batches | Real-time sending, full control over batching |\n| `EventHubBufferedProducerClient` | Automatic batching with background sending | High-volume, fire-and-forget scenarios |\n| `EventHubConsumerClient` | Simple event reading | Prototyping only, NOT for production |\n| `EventProcessorClient` | Production event processing | **Always use this for receiving in production** |\n\n## Core Workflow\n\n### 1. Send Events (Batch)\n\n```csharp\nusing Azure.Identity;\nusing Azure.Messaging.EventHubs;\nusing Azure.Messaging.EventHubs.Producer;\n\nawait using var producer = new EventHubProducerClient(\n    fullyQualifiedNamespace,\n    eventHubName,\n    new DefaultAzureCredential());\n\n// Create a batch (respects size limits automatically)\nusing EventDataBatch batch = await producer.CreateBatchAsync();\n\n// Add events to batch\nvar events = new[]\n{\n    new EventData(BinaryData.FromString(\"{\\\"id\\\": 1, \\\"message\\\": \\\"Hello\\\"}\")),\n    new EventData(BinaryData.FromString(\"{\\\"id\\\": 2, \\\"message\\\": \\\"World\\\"}\"))\n};\n\nforeach (var eventData in events)\n{\n    if (!batch.TryAdd(eventData))\n    {\n        // Batch is full - send it and create a new one\n        await producer.SendAsync(batch);\n        batch = await producer.CreateBatchAsync();\n        \n        if (!batch.TryAdd(eventData))\n        {\n            throw new Exception(\"Event too large for empty batch\");\n        }\n    }\n}\n\n// Send remaining events\nif (batch.Count > 0)\n{\n    await producer.SendAsync(batch);\n}\n```\n\n### 2. Send Events (Buffered - High Volume)\n\n```csharp\nusing Azure.Messaging.EventHubs.Producer;\n\nvar options = new EventHubBufferedProducerClientOptions\n{\n    MaximumWaitTime = TimeSpan.FromSeconds(1)\n};\n\nawait using var producer = new EventHubBufferedProducerClient(\n    fullyQualifiedNamespace,\n    eventHubName,\n    new DefaultAzureCredential(),\n    options);\n\n// Handle send success/failure\nproducer.SendEventBatchSucceededAsync += args =>\n{\n    Console.WriteLine($\"Batch sent: {args.EventBatch.Count} events\");\n    return Task.CompletedTask;\n};\n\nproducer.SendEventBatchFailedAsync += args =>\n{\n    Console.WriteLine($\"Batch failed: {args.Exception.Message}\");\n    return Task.CompletedTask;\n};\n\n// Enqueue events (sent automatically in background)\nfor (int i = 0; i < 1000; i++)\n{\n    await producer.EnqueueEventAsync(new EventData($\"Event {i}\"));\n}\n\n// Flush remaining events before disposing\nawait producer.FlushAsync();\n```\n\n### 3. Receive Events (Production - EventProcessorClient)\n\n```csharp\nusing Azure.Identity;\nusing Azure.Messaging.EventHubs;\nusing Azure.Messaging.EventHubs.Consumer;\nusing Azure.Messaging.EventHubs.Processor;\nusing Azure.Storage.Blobs;\n\n// Blob container for checkpointing\nvar blobClient = new BlobContainerClient(\n    Environment.GetEnvironmentVariable(\"BLOB_STORAGE_CONNECTION_STRING\"),\n    Environment.GetEnvironmentVariable(\"BLOB_CONTAINER_NAME\"));\n\nawait blobClient.CreateIfNotExistsAsync();\n\n// Create processor\nvar processor = new EventProcessorClient(\n    blobClient,\n    EventHubConsumerClient.DefaultConsumerGroup,\n    fullyQualifiedNamespace,\n    eventHubName,\n    new DefaultAzureCredential());\n\n// Handle events\nprocessor.ProcessEventAsync += async args =>\n{\n    Console.WriteLine($\"Partition: {args.Partition.PartitionId}\");\n    Console.WriteLine($\"Data: {args.Data.EventBody}\");\n    \n    // Checkpoint after processing (or batch checkpoints)\n    await args.UpdateCheckpointAsync();\n};\n\n// Handle errors\nprocessor.ProcessErrorAsync += args =>\n{\n    Console.WriteLine($\"Error: {args.Exception.Message}\");\n    Console.WriteLine($\"Partition: {args.PartitionId}\");\n    return Task.CompletedTask;\n};\n\n// Start processing\nawait processor.StartProcessingAsync();\n\n// Run until cancelled\nawait Task.Delay(Timeout.Infinite, cancellationToken);\n\n// Stop gracefully\nawait processor.StopProcessingAsync();\n```\n\n### 4. Partition Operations\n\n```csharp\n// Get partition IDs\nstring[] partitionIds = await producer.GetPartitionIdsAsync();\n\n// Send to specific partition (use sparingly)\nvar options = new SendEventOptions\n{\n    PartitionId = \"0\"\n};\nawait producer.SendAsync(events, options);\n\n// Use partition key (recommended for ordering)\nvar batchOptions = new CreateBatchOptions\n{\n    PartitionKey = \"customer-123\"  // Events with same key go to same partition\n};\nusing var batch = await producer.CreateBatchAsync(batchOptions);\n```\n\n## EventPosition Options\n\nControl where to start reading:\n\n```csharp\n// Start from beginning\nEventPosition.Earliest\n\n// Start from end (new events only)\nEventPosition.Latest\n\n// Start from specific offset\nEventPosition.FromOffset(12345)\n\n// Start from specific sequence number\nEventPosition.FromSequenceNumber(100)\n\n// Start from specific time\nEventPosition.FromEnqueuedTime(DateTimeOffset.UtcNow.AddHours(-1))\n```\n\n## ASP.NET Core Integration\n\n```csharp\n// Program.cs\nusing Azure.Identity;\nusing Azure.Messaging.EventHubs.Producer;\nusing Microsoft.Extensions.Azure;\n\nbuilder.Services.AddAzureClients(clientBuilder =>\n{\n    clientBuilder.AddEventHubProducerClient(\n        builder.Configuration[\"EventHub:FullyQualifiedNamespace\"],\n        builder.Configuration[\"EventHub:Name\"]);\n    \n    clientBuilder.UseCredential(new DefaultAzureCredential());\n});\n\n// Inject in controller/service\npublic class EventService\n{\n    private readonly EventHubProducerClient _producer;\n    \n    public EventService(EventHubProducerClient producer)\n    {\n        _producer = producer;\n    }\n    \n    public async Task SendAsync(string message)\n    {\n        using var batch = await _producer.CreateBatchAsync();\n        batch.TryAdd(new EventData(message));\n        await _producer.SendAsync(batch);\n    }\n}\n```\n\n## Best Practices\n\n1. **Use `EventProcessorClient` for receiving** — Never use `EventHubConsumerClient` in production\n2. **Checkpoint strategically** — After N events or time interval, not every event\n3. **Use partition keys** — For ordering guarantees within a partition\n4. **Reuse clients** — Create once, use as singleton (thread-safe)\n5. **Use `await using`** — Ensures proper disposal\n6. **Handle `ProcessErrorAsync`** — Always register error handler\n7. **Batch events** — Use `CreateBatchAsync()` to respect size limits\n8. **Use buffered producer** — For high-volume scenarios with automatic batching\n\n## Error Handling\n\n```csharp\nusing Azure.Messaging.EventHubs;\n\ntry\n{\n    await producer.SendAsync(batch);\n}\ncatch (EventHubsException ex) when (ex.Reason == EventHubsException.FailureReason.ServiceBusy)\n{\n    // Retry with backoff\n    await Task.Delay(TimeSpan.FromSeconds(5));\n}\ncatch (EventHubsException ex) when (ex.IsTransient)\n{\n    // Transient error - safe to retry\n    Console.WriteLine($\"Transient error: {ex.Message}\");\n}\ncatch (EventHubsException ex)\n{\n    // Non-transient error\n    Console.WriteLine($\"Error: {ex.Reason} - {ex.Message}\");\n}\n```\n\n## Checkpointing Strategies\n\n| Strategy | When to Use |\n|----------|-------------|\n| Every event | Low volume, critical data |\n| Every N events | Balanced throughput/reliability |\n| Time-based | Consistent checkpoint intervals |\n| Batch completion | After processing a logical batch |\n\n```csharp\n// Checkpoint every 100 events\nprivate int _eventCount = 0;\n\nprocessor.ProcessEventAsync += async args =>\n{\n    // Process event...\n    \n    _eventCount++;\n    if (_eventCount >= 100)\n    {\n        await args.UpdateCheckpointAsync();\n        _eventCount = 0;\n    }\n};\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.Messaging.EventHubs` | Core sending/receiving | `dotnet add package Azure.Messaging.EventHubs` |\n| `Azure.Messaging.EventHubs.Processor` | Production processing | `dotnet add package Azure.Messaging.EventHubs.Processor` |\n| `Azure.ResourceManager.EventHubs` | Management plane (create hubs) | `dotnet add package Azure.ResourceManager.EventHubs` |\n| `Microsoft.Azure.WebJobs.Extensions.EventHubs` | Azure Functions binding | `dotnet add package Microsoft.Azure.WebJobs.Extensions.EventHubs` |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["azure","eventhub","dotnet","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-azure-eventhub-dotnet","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-eventhub-dotnet","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34928 github stars · SKILL.md body (10,254 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T18:50:30.363Z","embedding":null,"createdAt":"2026-04-18T21:32:24.790Z","updatedAt":"2026-04-24T18:50:30.363Z","lastSeenAt":"2026-04-24T18:50:30.363Z","tsv":"'-1':576 '-123':523 '/;sharedaccesskeyname=...':104 '0':314,374,506,799,812 '1':219,263,333,636 '100':569,794,808 '1000':376 '12345':562 '2':270,318,646 '3':391,658 '4':484,668 '5':679,735 '6':686 '7':693 '8':702 'action':861 'add':37,47,52,61,252,822,829,838,846 'altern':90 'alway':113,210,689 'applic':855 'arg':349,358,442,460,802 'args.data.eventbody':448 'args.eventbatch.count':353 'args.exception.message':362,463 'args.partition.partitionid':445 'args.partitionid':466 'args.updatecheckpointasync':456,810 'ask':899 'asp.net':577 'async':441,617,801 'auth':93 'authent':50,105 'automat':184,246,368,712 'await':230,250,291,295,315,334,378,389,424,455,471,476,482,493,507,535,625,631,681,720,732,809 'azur':2,5,25,145,151,157,842 'azure-eventhub-dotnet':1 'azure.identity':54,108,225,398,583 'azure.messaging.eventhubs':11,39,66,110,227,400,718,818,824 'azure.messaging.eventhubs.consumer':402 'azure.messaging.eventhubs.processor':49,68,404,825,831 'azure.messaging.eventhubs.producer':112,229,326,585 'azure.resourcemanager.eventhubs':832,840 'azure.storage.blobs':63,406 'background':187,370 'backoff':731 'balanc':776 'base':780 'bash':29,72 'batch':174,182,185,222,242,249,255,281,293,294,308,317,351,360,453,534,624,633,694,713,722,784,790 'batch.count':313 'batch.tryadd':279,298,627 'batchopt':518,537 'begin':548 'best':634 'binarydata.fromstring':261,268 'bind':844 'blob':83,87,407,416,421 'blobclient':412,432 'blobclient.createifnotexistsasync':425 'blobcontainercli':414 'boundari':907 'buffer':321,704 'builder.configuration':591,594 'builder.services.addazureclients':588 'cancel':475 'cancellationtoken':479 'catch':723,736,750 'checkpoint':45,56,81,410,449,454,647,761,782,792 'clarif':901 'class':604 'clear':874 'client':162,164,670 'clientbuild':589 'clientbuilder.addeventhubproducerclient':590 'clientbuilder.usecredential':597 'complet':785 'connect':85,91,99,418 'consist':781 'console.writeline':350,359,443,446,461,464,746,757 'contain':88,408,422 'control':180,540 'controller/service':602 'core':30,217,578,819 'creat':240,287,426,671,835 'createbatchasync':697 'createbatchopt':520 'credenti':119,140 'criteria':910 'critic':771 'csharp':106,223,324,396,487,545,580,716,791 'current':64 'custom':522 'data':148,154,160,447,772 'datetimeoffset.utcnow.addhours':575 'defaultazurecredenti':115,121,239,343,437,599 'describ':862,878 'dispos':388,685 'dotnet':4,36,46,51,60,821,828,837,845 'empti':307 'end':552 'endpoint':101 'enqueu':365 'ensur':683 'environ':70,890 'environment-specif':889 'environment.getenvironmentvariable':124,131,415,420 'error':458,462,691,714,742,748,756,758 'event':6,16,23,26,146,152,158,171,199,208,221,253,257,277,303,311,320,354,366,382,386,393,439,509,524,554,651,657,695,768,775,795,804 'eventcount':798,805,807,811 'eventdata':260,267,275,280,299,381,629 'eventdatabatch':248 'eventhub':3,73,78,98,125,132,592,595 'eventhubbufferedproducercli':183,339 'eventhubbufferedproducerclientopt':330 'eventhubconsumercli':197,643 'eventhubconsumerclient.defaultconsumergroup':433 'eventhubnam':130,139,237,341,435 'eventhubproducercli':137,169,235,608,612 'eventhubsexcept':724,737,751 'eventhubsexception.failurereason.servicebusy':728 'eventposit':538 'eventposition.earliest':549 'eventposition.fromenqueuedtime':574 'eventposition.fromoffset':561 'eventposition.fromsequencenumber':568 'eventposition.latest':556 'eventprocessorcli':59,82,206,395,431,638 'eventservic':605,611 'everi':656,767,773,793 'ex':725,738,752 'ex.istransient':740 'ex.message':749,760 'ex.reason':727,759 'except':302 'execut':857 'expert':895 'fail':361 'fire':193 'fire-and-forget':192 'flush':384 'foreach':273 'forget':195 'full':179,283 'fulli':74,126 'fullyqualifiednamespac':123,138,236,340,434,593 'function':843 'get':488 'go':528 'grace':481 'guarante':664 'handl':345,438,457,687,715 'handler':692 'hello':265 'high':14,190,322,708 'high-throughput':13 'high-volum':189,707 'hub':7,27,147,153,159,836 'id':262,269,490 'immedi':172 'inject':600 'input':904 'instal':28,817 'int':372,797 'integr':579 'interv':654,783 'key':513,527,661 'larg':305 'limit':245,701,866 'logic':789 'low':769 'manag':833 'match':875 'maximumwaittim':331 'messag':264,271,621,630 'microsoft.azure.webjobs.extensions.eventhubs':841,848 'microsoft.extensions.azure':587 'miss':912 'n':650,774 'name':79,89,133,423,596 'namespac':76,128 'net':10,12 'never':641 'new':120,136,234,238,258,259,266,289,301,329,338,342,380,413,430,436,503,519,553,598,628 'non':754 'non-transi':753 'number':567 'offset':560 'one':290 'oper':486 'option':328,344,502,510,539 'order':516,663 'output':884 'overview':865 'owner':161 'packag':31,38,41,48,53,62,823,830,839,847 'partit':444,465,485,489,498,512,531,660,667 'partitionid':492,505 'partitionkey':521 'permiss':905 'plane':834 'practic':635 'privat':606,796 'process':209,451,470,787,803,827 'processerrorasync':688 'processor':40,427,429 'processor.processerrorasync':459 'processor.processeventasync':440,800 'processor.startprocessingasync':472 'processor.stopprocessingasync':483 'produc':135,233,337,609,613,614,615,705 'producer.createbatchasync':251,296,536,626 'producer.enqueueeventasync':379 'producer.flushasync':390 'producer.getpartitionidsasync':494 'producer.sendasync':292,316,508,632,721 'producer.sendeventbatchfailedasync':357 'producer.sendeventbatchsucceededasync':348 'product':42,97,117,205,207,216,394,645,826 'program.cs':581 'proper':684 'prototyp':201 'public':603,610,616 'purpos':165,816 'qualifi':75,127 'rbac':142 'read':200,544 'readon':607 'real':176 'real-tim':175 'receiv':22,35,43,150,155,214,392,640 'recommend':95,514 'regist':690 'relat':813 'remain':310,385 'requir':57,141,903 'respect':243,699 'retri':729,745 'return':355,363,467 'reus':669 'review':896 'role':143 'run':473 'safe':678,743 'safeti':906 'scenario':196,710 'scope':877 'sdk':8,18,815 'sdks':814 'send':20,32,144,170,178,188,220,284,309,319,346,495 'sendasync':619 'sender':149 'sendeventopt':504 'sending/receiving':820 'sent':352,367 'sequenc':566 'servicebus.windows.net':77,103 'servicebus.windows.net/;sharedaccesskeyname=...':102 'simpl':34,198 'singleton':675 'size':244,700 'skill':853,869 'skill-azure-eventhub-dotnet' 'source-sickn33' 'spare':500 'specif':497,559,565,572,891 'start':469,543,546,550,557,563,570 'stop':480,897 'storag':84,417 'strateg':648 'strategi':762,763 'stream':17 'string':86,92,100,419,491,620 'substitut':887 'success':909 'success/failure':347 'task':618,873 'task.completedtask':356,364,468 'task.delay':477,733 'test':893 'thread':677 'thread-saf':676 'throughput':15 'throughput/reliability':777 'throw':300 'time':177,573,653,779 'time-bas':778 'timeout.infinite':478 'timespan.fromseconds':332,734 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'transient':741,747,755 'treat':882 'tri':719 'type':163 'use':107,109,111,114,168,211,224,226,228,231,247,325,335,397,399,401,403,405,499,511,532,582,584,586,622,637,642,659,673,680,682,696,703,717,766,851,867 'v5.12.2':67,69 'valid':892 'var':118,122,129,134,232,256,274,327,336,411,428,501,517,533,623 'variabl':71 'version':65 'via':24 'volum':191,323,709,770 'within':665 'workflow':218,859 'world':272","prices":[{"id":"f6d90132-86cd-4f6d-bbb8-08dfd25029b8","listingId":"150c9f9e-a695-4bcd-9016-63b64cac6e25","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:32:24.790Z"}],"sources":[{"listingId":"150c9f9e-a695-4bcd-9016-63b64cac6e25","source":"github","sourceId":"sickn33/antigravity-awesome-skills/azure-eventhub-dotnet","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-eventhub-dotnet","isPrimary":false,"firstSeenAt":"2026-04-18T21:32:24.790Z","lastSeenAt":"2026-04-24T18:50:30.363Z"}],"details":{"listingId":"150c9f9e-a695-4bcd-9016-63b64cac6e25","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"azure-eventhub-dotnet","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34928,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-24T06:41:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"715ce4a9b1803bc40d762308c41d0c12eb793f54","skill_md_path":"skills/azure-eventhub-dotnet/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-eventhub-dotnet"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"azure-eventhub-dotnet","description":"Azure Event Hubs SDK for .NET."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-eventhub-dotnet"},"updatedAt":"2026-04-24T18:50:30.363Z"}}