<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Manohari Jayachandran</title>
    <description>The latest articles on DEV Community by Manohari Jayachandran (@manoharij).</description>
    <link>https://dev.to/manoharij</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3978389%2Fcfe78c8c-e935-4e13-80d4-fc953898678e.png</url>
      <title>DEV Community: Manohari Jayachandran</title>
      <link>https://dev.to/manoharij</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manoharij"/>
    <language>en</language>
    <item>
      <title>Azure Function Apps in C#: Triggers, Bindings, Durable Functions and Everything I Learned in Production</title>
      <dc:creator>Manohari Jayachandran</dc:creator>
      <pubDate>Thu, 11 Jun 2026 12:24:40 +0000</pubDate>
      <link>https://dev.to/manoharij/azure-function-apps-in-c-triggers-bindings-durable-functions-and-everything-i-learned-in-2om0</link>
      <guid>https://dev.to/manoharij/azure-function-apps-in-c-triggers-bindings-durable-functions-and-everything-i-learned-in-2om0</guid>
      <description>&lt;p&gt;Azure Function Apps are a serverless compute service that runs small focused pieces of C# code in response to events. You write a function, deploy it to Azure, and it runs only when triggered — paying only for the milliseconds it actually executes, not for a server sitting idle 24 hours a day.&lt;br&gt;
I used Function Apps at Blue Yonder as the transformation and processing layer in our integration pipelines. Logic Apps handled orchestration, Service Bus handled messaging, and Function Apps handled the complex C# logic that was too sophisticated for Logic App expressions.&lt;/p&gt;

&lt;p&gt;Function App vs Logic App vs API Management&lt;br&gt;
This is the question every Azure engineer faces. Here is the honest answer:&lt;br&gt;
Use Function Apps when you need complex C# business logic, custom data transformation algorithms, high performance compute, or reusable code components across multiple pipelines.&lt;br&gt;
Use Logic Apps when you are connecting existing services visually, the workflow has clear sequential steps, or you need one of the 500+ built-in connectors.&lt;br&gt;
Use API Management when exposing APIs to external consumers, applying rate limiting and authentication, or managing API versioning and documentation.&lt;br&gt;
The real answer for enterprise integrations is use all three together. APIM as the front door, Logic App as the orchestrator, Function App for complex transformations, Service Bus for reliable messaging between them. This is exactly the pattern I built at Blue Yonder.&lt;/p&gt;

&lt;p&gt;The Six Trigger Types&lt;br&gt;
A trigger is what causes your function to run. Every function must have exactly one trigger.&lt;br&gt;
HTTP Trigger runs when an HTTP request arrives. Use for REST APIs, webhooks, and callbacks from external systems.&lt;br&gt;
Timer Trigger runs on a schedule using a CRON expression. Use for nightly jobs, hourly reports, and cleanup tasks. The expression "0 0 2 * * *" runs at 2am every day.&lt;br&gt;
Service Bus Trigger runs when a message arrives on a queue or topic subscription. This was my most used trigger at Blue Yonder. It automatically handles retries and dead lettering — your function completing successfully means the message is completed, throwing an exception means it gets retried.&lt;br&gt;
Blob Storage Trigger runs when a file is uploaded to Azure Blob Storage. Use for image processing, file transformation, and document parsing.&lt;br&gt;
Queue Storage Trigger runs when a message arrives in an Azure Storage Queue. Good for simple high-volume task processing at the lowest cost.&lt;br&gt;
Event Grid Trigger runs when an Azure event occurs — like a new user created in Azure AD or a resource deployed in your subscription. Use for reacting to platform-level events.&lt;/p&gt;

&lt;p&gt;Input and Output Bindings&lt;br&gt;
Bindings are the most underused feature of Function Apps. They connect your function to other Azure services without writing any connection boilerplate code.&lt;br&gt;
An input binding reads data into your function automatically. An output binding writes data out of your function automatically. You declare what you need in the function signature and Azure handles the connections.&lt;br&gt;
Instead of writing 20 lines of SQL connection code to read a record, you add one attribute to your parameter and Azure injects the data directly. Instead of writing Service Bus SDK code to send a message, you add an output binding and just call AddAsync with your object.&lt;br&gt;
This eliminates entire classes of connection bugs and makes functions dramatically easier to read and test.&lt;/p&gt;

&lt;p&gt;Durable Functions — Long Running Workflows&lt;br&gt;
Regular functions run for a maximum of 10 minutes on the Consumption plan. Durable Functions solve this with a pattern that can run for hours, days, or even months.&lt;br&gt;
There are three function types. The Orchestrator coordinates the workflow — calling activity functions in sequence or parallel, handling retries and timeouts, with state automatically checkpointed so it survives restarts. The Activity does the actual work — calling external APIs, querying databases, sending messages. The Client starts the workflow, usually via an HTTP trigger, and returns an instance ID for status checking.&lt;br&gt;
I used Durable Functions at Blue Yonder for integration flows that needed to wait for external system responses — start the flow, call ServiceNow, wait up to 24 hours for a callback, then continue processing. Without Durable Functions this required complex custom state management. With them it was straightforward orchestration code.&lt;/p&gt;

&lt;p&gt;Connecting to Azure Key Vault&lt;br&gt;
Never hardcode connection strings in your function code. Use Key Vault references in your application settings instead.&lt;br&gt;
In the Azure Portal under your Function App Configuration, add an application setting with a Key Vault reference as the value. Azure resolves the reference automatically at runtime — your code just reads the setting name as a normal environment variable. Enable Managed Identity on your Function App and grant it the Key Vault Secrets User role. No passwords anywhere in code or config files, ever.&lt;/p&gt;

&lt;p&gt;Hosting Plans — Which to Choose&lt;br&gt;
The Consumption plan charges per execution at roughly $0.20 per million calls. It auto-scales automatically but has a 10 minute timeout and 1-3 second cold starts on first call. Perfect for unpredictable traffic and low volume workloads.&lt;br&gt;
The Premium plan costs around $140 per month minimum but eliminates cold starts with pre-warmed instances, has no timeout limit, and supports VNet integration. Use this for production customer-facing functions where latency matters.&lt;br&gt;
The Dedicated plan runs on an existing App Service plan. Use this when you already have App Service infrastructure and want consistent predictable load without the serverless cold start behavior.&lt;/p&gt;

&lt;p&gt;Key Lessons From Production&lt;br&gt;
Always use Managed Identity and Key Vault — never hardcode connection strings anywhere.&lt;br&gt;
Service Bus trigger is more reliable than HTTP for processing integration messages — it handles retries, dead lettering, and message locking automatically.&lt;br&gt;
Use Durable Functions for any workflow that might run longer than 10 minutes or needs to wait for external callbacks.&lt;br&gt;
Premium plan eliminates cold starts for customer-facing functions — the Consumption plan cold start is acceptable for background processing but not for real-time user requests.&lt;br&gt;
Keep functions small and focused — one function should do one job. If your function is doing three things, split it into three functions.&lt;br&gt;
Always add local.settings.json to your .gitignore file — it contains your local connection strings and must never be committed to GitHub.&lt;/p&gt;

&lt;p&gt;The Complete Azure Integration Stack&lt;br&gt;
This is the architecture that handles enterprise-scale integrations reliably:&lt;br&gt;
External requests enter through Azure API Management which handles authentication, rate limiting, and routing. Logic Apps orchestrate the business workflow using built-in connectors. Azure Service Bus provides reliable messaging between components with dead letter queues for failures. Function Apps handle complex C# transformation logic that Logic Apps cannot express. Azure SQL Database provides persistent storage. Application Insights monitors every step of the entire stack automatically.&lt;br&gt;
Each layer has one responsibility. No layer does what another layer is designed for. This separation is what makes the architecture maintainable and debuggable at scale.&lt;/p&gt;

&lt;p&gt;Summary&lt;br&gt;
Azure Function Apps are the C# powerhouse of the Azure integration stack. Serverless execution means zero infrastructure management. Six trigger types connect to every Azure service. Bindings eliminate boilerplate connection code. Durable Functions handle complex long-running workflows.&lt;br&gt;
Combined with Logic Apps for orchestration, Service Bus for messaging, and APIM for the front door — Function Apps complete the enterprise integration toolkit on Azure.&lt;/p&gt;

&lt;p&gt;Originally published at TechStack Blog — &lt;a href="https://calm-island-0a7b4b30f.7.azurestaticapps.net/" rel="noopener noreferrer"&gt;https://calm-island-0a7b4b30f.7.azurestaticapps.net/&lt;/a&gt;&lt;br&gt;
Follow for weekly posts on Azure integration, C#, and cloud engineering.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>csharp</category>
      <category>dotnet</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Azure API Management: Gateway, Policies, Authentication and Everything I Learned in Production</title>
      <dc:creator>Manohari Jayachandran</dc:creator>
      <pubDate>Wed, 10 Jun 2026 21:39:43 +0000</pubDate>
      <link>https://dev.to/manoharij/azure-api-management-gateway-policies-authentication-and-everything-i-learned-in-production-47g2</link>
      <guid>https://dev.to/manoharij/azure-api-management-gateway-policies-authentication-and-everything-i-learned-in-production-47g2</guid>
      <description>&lt;p&gt;Azure API Management (APIM) is a fully managed gateway that sits in front of all your backend APIs. Instead of exposing your raw APIs directly to consumers, every request goes through APIM first. It handles security, rate limiting, transformation, monitoring, and documentation — all in one place.&lt;br&gt;
I used APIM at Blue Yonder as the front door for all integrations on the SIAM platform. Every external system — Salesforce, ServiceNow, third-party vendors — called our APIs through APIM. It gave us one place to control, monitor, and secure everything.&lt;/p&gt;

&lt;p&gt;Core Components&lt;br&gt;
API Gateway receives all incoming API calls, applies policies before forwarding to the backend, and returns the response to the caller. This is the actual runtime component that handles every single request.&lt;br&gt;
Developer Portal is an auto-generated documentation website where developers can discover and test your APIs, subscribe for API keys, and get started without calling your team. It is fully customizable with your branding.&lt;br&gt;
Management Plane is the Azure Portal interface where you define APIs, products, policies, and users. You can import APIs directly from OpenAPI specs, WSDL files, Logic Apps, or Function Apps.&lt;br&gt;
Analytics automatically logs every request with response times, error rates, and usage broken down by consumer. Built-in dashboards show you exactly what is happening across all your APIs.&lt;/p&gt;

&lt;p&gt;APIs, Products and Subscriptions&lt;br&gt;
Understanding this three-level hierarchy is the key to using APIM correctly.&lt;br&gt;
An API is a group of related operations. For example an Orders API would contain GET /orders, GET /orders/{id}, POST /orders, and DELETE /orders/{id}.&lt;br&gt;
A Product is a bundle of one or more APIs with its own subscription keys and policies. A Partner Product might contain the Orders API and Inventory API with a limit of 5000 calls per day and require approval to subscribe.&lt;br&gt;
A Subscription is a key pair that grants access to a Product. Every caller gets their own subscription key. You can revoke individual keys without affecting any other consumer — critical for security incidents.&lt;br&gt;
At Blue Yonder we had three products:&lt;/p&gt;

&lt;p&gt;Internal Product — no rate limit, no approval needed&lt;br&gt;
Partner Product — 5000 calls per day, requires approval&lt;br&gt;
Public Product — 100 calls per day, open signup&lt;/p&gt;

&lt;p&gt;Policies — The Heart of APIM&lt;br&gt;
Policies are rules that run on every request or response. Written in XML, they are applied at four levels — Global, Product, API, or Operation — giving you incredibly fine-grained control.&lt;br&gt;
Every request goes through four policy sections in order:&lt;/p&gt;

&lt;p&gt;Inbound — runs before the request reaches your backend&lt;br&gt;
Backend — controls how the backend is called&lt;br&gt;
Outbound — runs before the response reaches the caller&lt;br&gt;
On-Error — runs when any policy throws an exception&lt;/p&gt;

&lt;p&gt;Here are the policies I used most in production:&lt;br&gt;
Rate limiting — limits a caller to a set number of calls per time window. Returns 429 Too Many Requests when exceeded.&lt;br&gt;
Quota — a hard cumulative limit over a longer period. Different from rate limiting — this counts total calls over the day rather than calls per minute.&lt;br&gt;
IP filtering — only allow requests from specific IP address ranges. Essential for internal APIs that should never be called from the public internet.&lt;br&gt;
Validate JWT — validates an Azure AD JWT token on every request. This is the most important security policy for external-facing APIs. It checks the token is valid, not expired, and contains the required claims.&lt;br&gt;
Set header — adds or modifies a header on the backend request. We used this to pass internal API keys to backend services without ever exposing them to callers. The caller sends their subscription key. APIM validates it then adds the real internal key before forwarding.&lt;br&gt;
Rewrite URL — maps the external URL to a different internal URL. Callers hit /orders/{id} while the backend receives /v2/orders/{id}. This lets you version your backend without breaking existing callers.&lt;br&gt;
Cache response — caches GET responses for a configurable duration. We cached inventory lookups for 5 minutes which reduced backend load by 60 percent during peak hours.&lt;br&gt;
Transform JSON to XML — converts a JSON request body to XML before forwarding to legacy backends. Modern callers send JSON, APIM handles the transformation transparently.&lt;/p&gt;

&lt;p&gt;Authentication Options&lt;br&gt;
APIM supports four authentication methods. You choose based on who is calling and what level of security you need.&lt;br&gt;
Subscription Key is the simplest option. The caller passes a key in the Ocp-Apim-Subscription-Key header. Good for partner and internal system integrations where you control both ends.&lt;br&gt;
OAuth 2.0 with Azure AD is the most secure option for external APIs. The caller gets a JWT token from Azure AD first then passes it as a Bearer token. APIM validates it using the validate-jwt policy. The token contains the caller identity, roles, and permissions. Use this for all user-facing apps and B2B enterprise integrations.&lt;br&gt;
Client Certificate (mTLS) requires the caller to present a certificate instead of a password. APIM validates the certificate thumbprint. We used this at Blue Yonder for banking integrations where the highest security was required.&lt;br&gt;
Basic Authentication passes username and password encoded as Base64. Only use this for legacy systems that support nothing else and always over HTTPS. Avoid for any new integration.&lt;/p&gt;

&lt;p&gt;Named Values — Storing Secrets Safely&lt;br&gt;
Named Values are APIM variables that store sensitive values like API keys and connection strings. You reference them in policies using double curly braces without ever hardcoding the actual value.&lt;br&gt;
When you create a Named Value you mark it as secret. The value is encrypted at rest and never visible in the portal after saving. Best practice is to link Named Values directly to Azure Key Vault so secrets rotate automatically without any policy changes.&lt;/p&gt;

&lt;p&gt;Versioning and Revisions&lt;br&gt;
Versions handle breaking changes. You run v1 and v2 simultaneously at different URLs. Callers choose which version to use and you retire v1 only after all callers have migrated. No forced upgrades.&lt;br&gt;
Revisions handle non-breaking changes. You create Revision 2 as a work in progress that is not live yet. Make and test your changes safely. Promote to live when ready. Instantly roll back to Revision 1 if something goes wrong.&lt;br&gt;
This is how we deployed all APIM changes at Blue Yonder — zero downtime, zero caller impact, instant rollback capability.&lt;/p&gt;

&lt;p&gt;Monitoring and Tracing&lt;br&gt;
Every APIM request automatically logs the timestamp, caller IP, subscription key used, operation called, response time, and HTTP status code.&lt;br&gt;
The most useful debugging tool is request tracing. Add the Ocp-Apim-Trace: true header to any request and the response includes a full trace of every policy step — exactly what data entered each policy, what came out, and how long it took. This saved me hours of debugging at Blue Yonder. You can see precisely which policy transformed what and where a request slowed down or failed.&lt;br&gt;
Connect APIM to Application Insights and every request appears there automatically. Set alerts on error rate thresholds or response time degradation to catch problems before your callers do.&lt;/p&gt;

&lt;p&gt;The Full Enterprise Integration Pattern&lt;br&gt;
This is the complete architecture I built at Blue Yonder combining APIM with Logic Apps, Service Bus, and Azure SQL:&lt;br&gt;
External System&lt;br&gt;
    |&lt;br&gt;
    | HTTPS with JWT token&lt;br&gt;
    v&lt;br&gt;
Azure APIM&lt;br&gt;
    Validates JWT token&lt;br&gt;
    Applies rate limiting&lt;br&gt;
    Adds correlation ID header&lt;br&gt;
    Rewrites URL to internal format&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
Azure Logic App&lt;br&gt;
    Orchestrates business workflow&lt;br&gt;
    Calls ServiceNow and Salesforce APIs&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
Azure Service Bus&lt;br&gt;
    Reliable async messaging&lt;br&gt;
    Dead letter queue for failures&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
Azure App Service API&lt;br&gt;
    Processes the message&lt;br&gt;
    Updates the database&lt;br&gt;
    |&lt;br&gt;
    v&lt;br&gt;
Azure SQL Database&lt;br&gt;
Each layer has one job. APIM handles the front door. Logic Apps handles orchestration. Service Bus handles reliability. The API handles business logic. SQL handles persistence.&lt;/p&gt;

&lt;p&gt;Key Lessons From Production&lt;br&gt;
Always use Named Values for secrets — never hardcode API keys or passwords directly in policy XML.&lt;br&gt;
Apply rate limiting at Product level not Global — different consumers have different needs. Partners get more calls than public users.&lt;br&gt;
Use Revisions for every change — instant rollback has saved production incidents more than once.&lt;br&gt;
Enable Application Insights from day one — you will need those logs the moment something goes wrong in production.&lt;br&gt;
Use the Trace header during development — it shows exactly what every policy does to every request. Invaluable for debugging complex policy chains.&lt;br&gt;
Set up the Developer Portal early — partners and consumers love self-service documentation. It reduces support requests dramatically.&lt;br&gt;
Use validate-jwt for all external APIs — subscription keys alone are not enough. Tokens give you identity, roles, and expiry.&lt;br&gt;
Add circuit breaker on every backend — protect your services from cascade failures when a downstream system goes down.&lt;/p&gt;

&lt;p&gt;APIM Tiers&lt;br&gt;
The Consumption tier charges per call with no monthly commitment — perfect for learning and low traffic APIs. The Developer tier costs around $50 per month with full features but no SLA — good for development and testing. Basic at around $150 per month is the entry point for production workloads. Standard at around $700 per month adds VNet support for enterprise use. Premium at around $2800 per month enables multi-region deployment and zone redundancy for global enterprise applications.&lt;/p&gt;

&lt;p&gt;Summary&lt;br&gt;
Azure API Management is the professional way to expose APIs in enterprise Azure architectures. One gateway to handle security, rate limiting, transformation, versioning, and monitoring for all your APIs.&lt;br&gt;
Combined with Azure AD for authentication, Key Vault for secrets, Logic Apps for orchestration, and Service Bus for messaging — APIM completes the enterprise integration stack on Azure. If you are building serious integrations on Azure, APIM is not optional. It is the foundation everything else builds on.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;br&gt;
&lt;a href="https://calm-island-0a7b4b30f.7.azurestaticapps.net/" rel="noopener noreferrer"&gt;https://calm-island-0a7b4b30f.7.azurestaticapps.net/&lt;/a&gt;&lt;br&gt;
If you found this useful, follow me for more posts on Azure integration, C#, and cloud engineering.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>dotnet</category>
      <category>csharp</category>
      <category>cloudcomputing</category>
    </item>
  </channel>
</rss>
