<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/indexing-and-searching-nuget-org-with-azure-functions-and-search-rinnov2at" -->

---
title: Indexing and searching NuGet.org with Azure Functions...
description: A deep technical walkthrough of building a serverless 'reverse package search' engine for NuGet.org using Azure Functions and Azure Search. The author covers...
canonical: https://daily.dev/posts/indexing-and-searching-nuget-org-with-azure-functions-and-search-rinnov2at
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Indexing and searching NuGet.org with Azure Functions and Search | daily.dev
og:description: A deep technical walkthrough of building a serverless 'reverse package search' engine for NuGet.org using Azure Functions and Azure Search. The author covers...
og:url: https://daily.dev/posts/indexing-and-searching-nuget-org-with-azure-functions-and-search-rinnov2at
og:image: https://api.daily.dev/og/posts/rINnoV2at.png
og:image:alt: Indexing and searching NuGet.org with Azure Functions and Search
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Indexing and searching NuGet.org with Azure Functions and Search

**[Maarten Balliauw](https://daily.dev/sources/maartenballiauw)** · 34 min read · 0 upvotes · 0 comments

## Summary

A deep technical walkthrough of building a serverless 'reverse package search' engine for NuGet.org using Azure Functions and Azure Search. The author covers reading NuGet's V3 catalog API as an event stream, building custom trigger and output bindings for Azure Functions (including a custom NuGet catalog trigger and an Azure Search output binding), downloading and indexing package binaries using System.Reflection.Metadata to extract public types without assembly loading, designing an Azure Search index schema, and exposing a search API compatible with ReSharper/Rider's existing reverse package search feature. The pipeline indexed 2.1 million package versions in about 12 hours on modest VM instances. Full source code is provided on GitHub.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://blog.maartenballiauw.be/posts/2019-07-30-indexing-searching-nuget-with-azure-functions-and-search>

## Questions this post answers

### How can I extract public type names and namespaces from a .NET assembly without loading it into a runtime?

Use the System.Reflection.Metadata package to read the Portable Executable (PE) header's metadata tables directly instead of using reflection or Assembly.Load. By looping over entries in the TypeDef table and following pointers into the #Strings table, you can retrieve public type names and namespaces quickly and safely, avoiding the overhead and risk of loading every assembly into memory.

_See how daily.dev surfaces practical approaches like this for developers working with assembly metadata and indexing pipelines._

### How do I create a custom trigger binding for Azure Functions, like one that watches an external event stream?

Create an attribute class marked with [Binding], implement IExtensionConfigProvider to register it via AddBindingRule().BindToTrigger(), and build an ITriggerBinding plus an IListener that calls executor.TryExecuteAsync() with data whenever new events arrive. Register the extension in a WebJobsStartup class. Although Microsoft doesn't officially support custom trigger bindings, this approach was used to build a NuGet catalog trigger that fires on new package events.

_Developers architecting custom Azure Functions triggers can find grounded implementation walkthroughs like this through daily.dev._

### How fast can you index all of NuGet.org's public types using Azure Functions and Azure Search?

A full index run completed in roughly 12 hours when scaled across two B1ms reserved instances, each with one vCPU and 2 GB of RAM. The run processed 2.1 million package versions found across more than 8,400 catalog pages and 4.2 million catalog leafs, with the leaf count roughly doubled due to NuGet's repository signing re-indexing every package shortly beforehand.

_Teams estimating serverless indexing throughput can track real-world benchmarks like this one on daily.dev._

## Similar posts on daily.dev

- [The Complete Guide to Creating NuGet Packages in .NET](https://daily.dev/posts/the-complete-guide-to-creating-nuget-packages-in-net-4carsceoo) · We Are .NET · 0 upvotes · 0 comments
- [Vector Search in .NET: The Azure AI Search Query Model](https://daily.dev/posts/vector-search-in-net-the-azure-ai-search-query-model-xiddrqbjs) · We Are .NET · 0 upvotes · 0 comments
- [Scaling to 100k\+ Products: A Resilient .NET 10, K8s, and Next.js 15 Event-Driven Architecture](https://daily.dev/posts/scaling-to-100k-products-a-resilient-net-10-k8s-and-next-js-15-event-driven-architecture-w4juev2fb) · Medium · 17 upvotes · 0 comments
- [From Backup to Discovery: Veeam’s Search Engine Powered by Azure Cosmos DB](https://daily.dev/posts/from-backup-to-discovery-veeam-s-search-engine-powered-by-azure-cosmos-db-7hs5lvkak) · DevBlogs · 0 upvotes · 0 comments

---

Tags: [#serverless](https://daily.dev/tags/serverless), [#c#](https://daily.dev/tags/c#), [#azure-functions](https://daily.dev/tags/azure-functions), [#nuget](https://daily.dev/tags/nuget)

[View this post on daily.dev](https://daily.dev/posts/indexing-and-searching-nuget-org-with-azure-functions-and-search-rinnov2at)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Indexing and searching NuGet.org with Azure Functions and Search","url":"https://daily.dev/posts/indexing-and-searching-nuget-org-with-azure-functions-and-search-rinnov2at","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/indexing-and-searching-nuget-org-with-azure-functions-and-search-rinnov2at"},"datePublished":"2026-10-04T13:04:28.467Z","dateModified":"2026-10-04T13:42:31.305Z","description":"A deep technical walkthrough of building a serverless 'reverse package search' engine for NuGet.org using Azure Functions and Azure Search. The author covers...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/d5491757e5b2ae986ebba3c8d1d80b7d?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/d5491757e5b2ae986ebba3c8d1d80b7d?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Maarten Balliauw","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Maarten Balliauw","logo":"https://media.daily.dev/image/upload/s--rOTg3VYO--/f_auto,q_auto/v1791119043/logos/maartenballiauw?_a=BAMAMicg0","url":"https://daily.dev/sources/maartenballiauw"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/indexing-and-searching-nuget-org-with-azure-functions-and-search-rinnov2at","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"serverless,c#,azure-functions,nuget","timeRequired":"PT34M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Maarten Balliauw","item":"https://daily.dev/sources/maartenballiauw"},{"@type":"ListItem","position":3,"name":"Indexing and searching NuGet.org with Azure Functions and Search"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/indexing-and-searching-nuget-org-with-azure-functions-and-search-rinnov2at#faq","mainEntity":[{"@type":"Question","name":"How can I extract public type names and namespaces from a .NET assembly without loading it into a runtime?","acceptedAnswer":{"@type":"Answer","text":"Use the System.Reflection.Metadata package to read the Portable Executable (PE) header's metadata tables directly instead of using reflection or Assembly.Load. By looping over entries in the TypeDef table and following pointers into the #Strings table, you can retrieve public type names and namespaces quickly and safely, avoiding the overhead and risk of loading every assembly into memory. See how daily.dev surfaces practical approaches like this for developers working with assembly metadata and indexing pipelines."}},{"@type":"Question","name":"How do I create a custom trigger binding for Azure Functions, like one that watches an external event stream?","acceptedAnswer":{"@type":"Answer","text":"Create an attribute class marked with [Binding], implement IExtensionConfigProvider to register it via AddBindingRule().BindToTrigger(), and build an ITriggerBinding plus an IListener that calls executor.TryExecuteAsync() with data whenever new events arrive. Register the extension in a WebJobsStartup class. Although Microsoft doesn't officially support custom trigger bindings, this approach was used to build a NuGet catalog trigger that fires on new package events. Developers architecting custom Azure Functions triggers can find grounded implementation walkthroughs like this through daily.dev."}},{"@type":"Question","name":"How fast can you index all of NuGet.org's public types using Azure Functions and Azure Search?","acceptedAnswer":{"@type":"Answer","text":"A full index run completed in roughly 12 hours when scaled across two B1ms reserved instances, each with one vCPU and 2 GB of RAM. The run processed 2.1 million package versions found across more than 8,400 catalog pages and 4.2 million catalog leafs, with the leaf count roughly doubled due to NuGet's repository signing re-indexing every package shortly beforehand. Teams estimating serverless indexing throughput can track real-world benchmarks like this one on daily.dev."}}]}
```

