<?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: Dhana</title>
    <description>The latest articles on DEV Community by Dhana (@dhanagani_lakshmi_2487ad0).</description>
    <link>https://dev.to/dhanagani_lakshmi_2487ad0</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4114244%2Fe294e2fe-04e7-4575-9208-f6075df3783e.jpg</url>
      <title>DEV Community: Dhana</title>
      <link>https://dev.to/dhanagani_lakshmi_2487ad0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dhanagani_lakshmi_2487ad0"/>
    <language>en</language>
    <item>
      <title>Debugging ORA-06550 / PLS-00201 in ADO.NET: A Checklist Before You Start Changing Permissions</title>
      <dc:creator>Dhana</dc:creator>
      <pubDate>Mon, 07 Sep 2026 17:54:45 +0000</pubDate>
      <link>https://dev.to/dhanagani_lakshmi_2487ad0/debugging-ora-06550-pls-00201-in-adonet-a-checklist-before-you-start-changing-permissions-30pb</link>
      <guid>https://dev.to/dhanagani_lakshmi_2487ad0/debugging-ora-06550-pls-00201-in-adonet-a-checklist-before-you-start-changing-permissions-30pb</guid>
      <description>&lt;p&gt;Enterprise applications rarely live in a single, tidy Oracle schema. It's common to have one schema owning HR-related objects and another owning a different module, with application code that needs to call across both — and that's exactly where a specific, easy-to-misdiagnose error shows up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plsql"&gt;&lt;code&gt;&lt;span class="n"&gt;ORA&lt;/span&gt;&lt;span class="mi"&gt;-06550&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;column&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;PLS&lt;/span&gt;&lt;span class="mi"&gt;-00201&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;identifier&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SCHEMA_B.PKG_SOME_PACKAGE&lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;declared&lt;/span&gt;
&lt;span class="n"&gt;ORA&lt;/span&gt;&lt;span class="mi"&gt;-06550&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;column&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;PL&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;Statement&lt;/span&gt; &lt;span class="n"&gt;ignored&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The instinctive reaction is to jump straight to &lt;code&gt;GRANT EXECUTE&lt;/code&gt; and hope it fixes things. Sometimes that is the fix — but this error can come from several different root causes that look identical from the outside, so the more reliable approach is to verify systematically before changing anything on the database side.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;An ADO.NET connection authenticates as one schema (call it Schema A). The code needs to call a package that physically lives in a different schema (Schema B):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OracleCommand&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OracleCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SCHEMA_B.PKG_SOME_PACKAGE.GET_DETAILS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CommandType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CommandType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StoredProcedure&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// parameters, execute, etc.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On execution, Oracle throws &lt;code&gt;PLS-00201: identifier ... must be declared&lt;/code&gt; — even though the package genuinely exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Jumping Straight to Grants Is a Mistake
&lt;/h2&gt;

&lt;p&gt;This error message doesn't distinguish between several different possible causes, and blindly granting permissions wastes time when the real issue is something else entirely. Before touching grants, work through these checks in order:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Confirm the exact object name and owning schema.&lt;/strong&gt;&lt;br&gt;
Copy-pasted code between similar procedures is a common source of subtle mismatches — a missing schema prefix, a package name that's slightly off, or an object that was renamed since the code was last touched. Query directly to confirm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;object_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;object_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;all_objects&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;owner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'SCHEMA_B'&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;object_name&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%SOME_PACKAGE%'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't rely on memory or an old script for the exact name — verify it fresh, every time this error appears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Check the object's status, not just its existence.&lt;/strong&gt;&lt;br&gt;
An object can technically exist but be in an &lt;code&gt;INVALID&lt;/code&gt; state (often after a dependent object changes). The query above includes &lt;code&gt;status&lt;/code&gt; for exactly this reason — an invalid package can throw errors that look like an access problem but are actually a compilation problem upstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Verify the parameters being passed match the procedure's actual signature.&lt;/strong&gt;&lt;br&gt;
A mismatch in parameter count, order, or data type can sometimes surface as a resolution error rather than a clear "wrong parameters" message, especially with overloaded procedures inside a package. Double-check the package specification for the exact parameter list and types before assuming the problem is schema-related at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Only now, check execute privileges.&lt;/strong&gt;&lt;br&gt;
If the name is confirmed correct, the object is valid, and parameters match — then it's genuinely a privilege issue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;PKG_SOME_PACKAGE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;SCHEMA_A_USER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without this grant, the calling schema's session cannot resolve the package, regardless of how correctly the call is written.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Consider a synonym for cleaner long-term calls.&lt;/strong&gt;&lt;br&gt;
A grant alone lets the call work with a fully-qualified name, but a synonym in the calling schema avoids hardcoding the cross-schema prefix everywhere in application code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;SYNONYM&lt;/span&gt; &lt;span class="n"&gt;PKG_SOME_PACKAGE&lt;/span&gt; &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="n"&gt;SCHEMA_B&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PKG_SOME_PACKAGE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This also makes future changes easier — if the object's location ever changes, only the synonym needs updating, not every call site in the codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Combination Trips Up Developers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The error message doesn't tell you &lt;em&gt;which&lt;/em&gt; of several possible causes you're dealing with, so it's tempting to guess rather than verify&lt;/li&gt;
&lt;li&gt;Multi-schema Oracle setups are common in enterprise systems, but many developers' daily experience is single-schema, making this class of error unfamiliar&lt;/li&gt;
&lt;li&gt;Under time pressure, it's easy to skip straight to "just grant it" without confirming the actual object, its status, or the parameters being sent — sometimes fixing the wrong thing while the real cause goes unnoticed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;When you hit &lt;code&gt;PLS-00201&lt;/code&gt; across schemas in an ADO.NET + Oracle setup, resist the urge to immediately change permissions. Work through it as a checklist: confirm the exact object name and schema, check that the object is valid (not just present), verify the parameters match the procedure's actual signature, and only then move to grants and synonyms. This order matters — it's faster overall than guessing, and it avoids the situation where a grant gets added that was never actually the problem, while the real cause stays hidden.&lt;/p&gt;

&lt;p&gt;In multi-schema enterprise applications, this kind of methodical, don't-skip-steps debugging saves real time compared to reactive permission changes.&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>database</category>
      <category>dotnet</category>
      <category>csharp</category>
    </item>
    <item>
      <title>The ASP.NET Session Mistake That Broke Our Multi-Tab Workflow</title>
      <dc:creator>Dhana</dc:creator>
      <pubDate>Mon, 07 Sep 2026 16:31:10 +0000</pubDate>
      <link>https://dev.to/dhanagani_lakshmi_2487ad0/the-aspnet-session-mistake-that-broke-our-multi-tab-workflow-jka</link>
      <guid>https://dev.to/dhanagani_lakshmi_2487ad0/the-aspnet-session-mistake-that-broke-our-multi-tab-workflow-jka</guid>
      <description>&lt;p&gt;If you've worked on any mid-sized ASP.NET application that uses &lt;code&gt;Session&lt;/code&gt; to hold user or transaction context, you've probably run into a bug that looks &lt;em&gt;impossible&lt;/em&gt; to reproduce — until you realize the user had two browser tabs open.&lt;/p&gt;

&lt;p&gt;Here's the exact scenario I ran into, and why it's more dangerous than it first looks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A user logs in with one ID. That's one &lt;code&gt;Session&lt;/code&gt; on the server, tied to that one &lt;code&gt;ASP.NET_SessionId&lt;/code&gt; cookie.&lt;/p&gt;

&lt;p&gt;Now the user opens two tabs of the same app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tab 1&lt;/strong&gt;: opens Employee A's record — who is eligible for Transaction Type 1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tab 2&lt;/strong&gt;: opens Employee B's record — who is eligible for Transaction Type 2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both tabs are using the &lt;em&gt;same browser session cookie&lt;/em&gt;, which means both tabs are reading and writing to the &lt;strong&gt;exact same &lt;code&gt;Session&lt;/code&gt; object&lt;/strong&gt; on the server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Breaks
&lt;/h2&gt;

&lt;p&gt;Say the app stores the currently selected employee and their eligibility flag in Session:&lt;/p&gt;

&lt;p&gt;csharp&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"CurrentEmployeeId"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"EligibleTransactionType"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eligibilityType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The user is working in Tab 1 (Employee A), then switches to Tab 2 and opens Employee B. That action &lt;strong&gt;overwrites&lt;/strong&gt; &lt;code&gt;Session["CurrentEmployeeId"]&lt;/code&gt; and &lt;code&gt;Session["EligibleTransactionType"]&lt;/code&gt; with Employee B's values.&lt;/p&gt;

&lt;p&gt;Now the user switches back to Tab 1 and clicks &lt;strong&gt;Save&lt;/strong&gt;. The save action reads eligibility from &lt;code&gt;Session["EligibleTransactionType"]&lt;/code&gt; — but that value now belongs to Employee B, not Employee A. If there's no server-side re-validation at the point of save, &lt;strong&gt;Employee A's transaction gets saved using Employee B's eligibility rules.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No exception is thrown. No error is logged. The data just quietly becomes wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Is Worse Than a Normal Bug
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It's &lt;strong&gt;intermittent&lt;/strong&gt; — only happens with multiple tabs, so it's hard to reproduce in testing&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;passes all standard QA&lt;/strong&gt; — single-tab test cases work fine&lt;/li&gt;
&lt;li&gt;It causes &lt;strong&gt;silent data corruption&lt;/strong&gt;, not a crash — which means it can sit undetected in production for a long time&lt;/li&gt;
&lt;li&gt;It often gets misdiagnosed as a "random" data issue rather than a session-scoping bug&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Root Cause
&lt;/h2&gt;

&lt;p&gt;The core misunderstanding is this: &lt;strong&gt;&lt;code&gt;Session&lt;/code&gt; in ASP.NET is scoped to the user's session cookie, not to a browser tab.&lt;/strong&gt; All tabs in the same browser share the same session cookie by default, so they share the exact same &lt;code&gt;Session&lt;/code&gt; object on the server. There is no built-in per-tab isolation.&lt;/p&gt;

&lt;p&gt;Junior devs often mentally model &lt;code&gt;Session&lt;/code&gt; as "this user's current screen state," when it's really "this user's shared server-side bucket, accessible from anywhere they have a tab open."&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Actually Fix It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Never trust Session state alone for validation at save time.&lt;/strong&gt;&lt;br&gt;
Re-fetch and re-validate eligibility from the database (or source of truth) at the moment of save, using the entity ID that's actually being saved — not whatever happens to be sitting in Session.&lt;/p&gt;

&lt;p&gt;csharp&lt;br&gt;
 &lt;strong&gt;Bad&lt;/strong&gt;: trusts session blindly&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"EligibleTransactionType"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;requestedType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Better&lt;/strong&gt;: re-validate against the actual record being saved&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;currentEligibility&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_employeeService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEligibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeIdFromForm&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentEligibility&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;requestedType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;Save&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Pass context explicitly through the request, not implicitly through Session.&lt;/strong&gt;&lt;br&gt;
Instead of relying on &lt;code&gt;Session["CurrentEmployeeId"]&lt;/code&gt;, pass the employee ID as a hidden field, route parameter, or query string on each screen. Each tab then carries its own context in the request itself, not in a shared server bucket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. If you truly need tab-level isolation, use TempData or per-request tokens carefully — not Session.&lt;/strong&gt;&lt;br&gt;
Session is inherently shared across tabs; if isolated state per tab is a real requirement, look at approaches like encoding context in the URL, using unique form tokens per screen instance, or client-side state management instead of leaning on &lt;code&gt;Session&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Add server-side authorization/business rule checks as a final gate before any write.&lt;/strong&gt;&lt;br&gt;
Treat every save action as if the client could send anything — because in a multi-tab scenario, it effectively can. The last line of defense should always be a fresh check against the source of truth, not a value that was set several clicks ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Session&lt;/code&gt; feels like it belongs to "this screen," but it actually belongs to "this user, everywhere they're logged in right now." Any app doing multi-step or multi-screen validation needs to treat Session as a convenience cache, never as the final source of truth at the point of a write. The fix isn't complicated — re-validate on save — but the bug is easy to miss precisely because it only shows up when real users behave in ways your test cases didn't cover.&lt;/p&gt;

&lt;p&gt;If your app has any workflow where a user might reasonably have two screens open at once, it's worth auditing every &lt;code&gt;Session&lt;/code&gt;-dependent save action today, before it becomes a production incident.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>aspnet</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
