<?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: Screaminlean</title>
    <description>The latest articles on DEV Community by Screaminlean (@screaminlean).</description>
    <link>https://dev.to/screaminlean</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%2F4013471%2Fcc61d80f-0bd4-4551-9ccf-300f57477e64.png</url>
      <title>DEV Community: Screaminlean</title>
      <link>https://dev.to/screaminlean</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/screaminlean"/>
    <language>en</language>
    <item>
      <title>How to Build a Native .NET 8/10 Integration for Rockwell's Fiix CMMS (Without the Headache)</title>
      <dc:creator>Screaminlean</dc:creator>
      <pubDate>Fri, 03 Jul 2026 11:05:07 +0000</pubDate>
      <link>https://dev.to/screaminlean/how-to-build-a-native-net-810-integration-for-rockwells-fiix-cmms-without-the-headache-5foj</link>
      <guid>https://dev.to/screaminlean/how-to-build-a-native-net-810-integration-for-rockwells-fiix-cmms-without-the-headache-5foj</guid>
      <description>&lt;p&gt;If you’ve ever been tasked with syncing an internal ERP, an MES platform, or factory floor IoT sensors with Rockwell Automation’s &lt;strong&gt;Fiix CMMS&lt;/strong&gt;, you already know the deal. &lt;/p&gt;

&lt;p&gt;While Fiix provides a robust Java SDK, .NET developers are usually left out in the cold. You are forced to spin up custom implementations from scratch, wrestle with strict &lt;strong&gt;HMAC-SHA256 request signing&lt;/strong&gt;, and manually map out dozens of nested &lt;strong&gt;RPC (Remote Procedure Call)&lt;/strong&gt; payload schemas.&lt;/p&gt;

&lt;p&gt;I spent the last few years navigating these exact pain points. After a lot of refactoring, I rebuilt a completely open-source, production-ready solution from the ground up to save the .NET community hundreds of hours of development time.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;FiixCmms.Client.Net&lt;/strong&gt;—a native, multi-targeted framework engine for .NET 8 and .NET 10.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Enterprise Pitfalls of Custom Fiix Integrations
&lt;/h2&gt;

&lt;p&gt;When building a custom API bridge to Fiix, developers typically trip over three massive hurdles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Socket Exhaustion:&lt;/strong&gt; Manually instantiating &lt;code&gt;HttpClient&lt;/code&gt; for rapid-fire RPC updates to asset or work order tables quickly degrades application performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographic Overhead:&lt;/strong&gt; Missing or miscalculating the HMAC-SHA256 signature hash format in your HTTP headers results in immediate, vague authentication failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandbox Bottlenecks:&lt;/strong&gt; Waiting for corporate IT to clear a live sandbox environment can halt an active development sprint for weeks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is how this library solves all three out of the box using modern .NET architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Modern DX: The Clean Way to Connect
&lt;/h2&gt;

&lt;p&gt;Instead of messy wrappers, the library acts as a first-class ecosystem citizen. It introduces native &lt;code&gt;IServiceCollection&lt;/code&gt; extension methods backed by &lt;code&gt;IHttpClientFactory&lt;/code&gt; to completely eliminate socket exhaustion.&lt;/p&gt;

&lt;p&gt;Setting it up in your &lt;code&gt;Program.cs&lt;/code&gt; takes exactly one block of code:&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="nn"&gt;FiixCmms.Client.Extensions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Register the typed client lifecycle with automatic HMAC header signing&lt;/span&gt;
&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddFiixClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseUrl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"[https://your-subdomain.fiixcmms.com/api/v2/](https://your-subdomain.fiixcmms.com/api/v2/)"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AppKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Fiix:AppKey"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccessKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Fiix:AccessKey"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SecretKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"Fiix:SecretKey"&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;Once registered, you can inject IFiixClient directly into your services or background workers. It comes packed with 103 strongly-typed DTOs mapped 1:1 with the underlying schema engine:&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;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WorkOrderService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IFiixClient&lt;/span&gt; &lt;span class="n"&gt;_fiixClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;WorkOrderService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IFiixClient&lt;/span&gt; &lt;span class="n"&gt;fiixClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_fiixClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fiixClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;CompleteEmergencyWorkOrderAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;workOrderId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Fluent, strongly-typed async RPC pipelines&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workOrder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_fiixClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WorkOrders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetByIdAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;workOrderId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;workOrder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IntWorkOrderStatusID&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Completed&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_fiixClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WorkOrders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UpdateAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;workOrder&lt;/span&gt;&lt;span class="p"&gt;);&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;h2&gt;
  
  
  Testing Offline: A Zero-Dependency Mock API
&lt;/h2&gt;

&lt;p&gt;One of the features I am most proud of introducing in this ecosystem layout is a standalone Mock API Server.&lt;/p&gt;

&lt;p&gt;If you are writing integration tests inside a CI/CD pipeline or developing entirely offline, you don't need to touch a live network. The repository includes a lightweight, local RPC simulation engine. You can point your application's BaseUrl to the local mock instance and verify your code execution path instantly without burning through sandbox rate limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moving to Production: 1.0.1-rc2 is Live!
&lt;/h2&gt;

&lt;p&gt;The project originally started in 2023 as an experimental wrapper. Recognizing that enterprise applications demand stability, it has been completely rewritten from scratch to adhere to rigid SemVer and dependency standards.&lt;/p&gt;

&lt;p&gt;The stable Release Candidate (1.0.1-rc2) is officially live on NuGet right now.&lt;/p&gt;

&lt;p&gt;If your team is managing a manufacturing or facility tech stack built on Microsoft infrastructure, check out the repository, run the CLI tool, and try it out!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/Screaminlean/FiixCmms.Client.Net" rel="noopener noreferrer"&gt;Screaminlean/FiixCmms.Client.Net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NuGet Package:&lt;/strong&gt; &lt;a href="https://www.nuget.org/packages/FiixCmms.Client" rel="noopener noreferrer"&gt;FiixCmms.Client&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback, issues, or feature requests if you're working in the industrial automation space!&lt;/p&gt;

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