Running Angular on an IIS web server

Step 1.
Build your angular application for “production”:
ng build –dist -> output entire site to root/dist folder copy that folder to your IIS website folder.

Step 2.
IIS uses a file called web.config to setup some configuration for a website.
Make sure you have something similar as below in a web.config file in the site root folder (a typical Angular config scenario):

<configuration>
  <system.webServer>
    <!-- These rewrite rules requires the IIS Rewrite module -->
    <rewrite>
      <rules>
        <!-- Support for Angular internal url routing system (routing module) -->
        <rule name="Angular routing" stopProcessing="true">
          <match url=".*" />
          <conditions logicalGrouping="MatchAll">
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="/" />
        </rule>
        <!-- Adds https scheme if missing for all URLs -->
        <rule name="FQDN to SSL" stopProcessing="true">
          <match url="^(.*)$" />
          <conditions>
            <add input="{HTTPS}" pattern="^OFF$" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
        </rule>
      </rules>
    </rewrite>
    <!-- Mime type fix for woff2 font file type -->
    <staticContent>
      <remove fileExtension=".woff2" />
      <mimeMap fileExtension=".woff2" mimeType="font/woff2" />
    </staticContent>
  </system.webServer>

  <!-- Its okay to cache these static files, index.html will include cache busting paths for Angular js and css files. (when building with --dist param) -->
  <system.webServer>
    <caching enabled="true">
      <profiles>
        <add extension=".svg" policy="CacheUntilChange"/>
        <add extension=".ico" policy="CacheUntilChange"/>
        <add extension=".js" policy="CacheUntilChange"/>
        <add extension=".css" policy="CacheUntilChange"/>
      </profiles>
    </caching>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="5.00:00:00" />
    </staticContent>
  </system.webServer>

  <!-- Make sure index.html is never cached -->
  <location path="index.html">
    <system.webServer>
      <staticContent>
        <clientCache cacheControlMode="DisableCache" cacheControlMaxAge="0.00:00:00" />
      </staticContent>
      <httpProtocol>
        <customHeaders>
          <add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
          <add name="Pragma" value="no-cache" />
          <add name="Expires" value="-1" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>

</configuration>

 

Fine Code Coverage – Visual Studio Marketplace

Visualize unit test code coverage easily for free in Visual Studio Community Edition (and other editions too)

Coverage View
Source: Fine Code Coverage – Visual Studio Marketplace

Usage:

  1. Install
  2. Open the Fine Code Coverage window
  3. Run all unit tests
  4. See stats in Fine Code Coverage window
  5. Exclude the test project itself from coverage calculation:

    (Below excludes project that ends with .Test and all its types (*

Pattern: [assemblyname]type

Filter Expressions:

Wildcards
* => matches zero or more characters
		
Examples
[*]* => All types in all assemblies (nothing is instrumented)
[coverlet.*]Coverlet.Core.Coverage => The Coverage class in the Coverlet.Core namespace belonging to any assembly that matches coverlet.* (e.g coverlet.core)
[*]Coverlet.Core.Instrumentation.* => All types belonging to Coverlet.Core.Instrumentation namespace in any assembly
[coverlet.*.tests]* => All types in any assembly starting with coverlet. and ending with .tests

Both 'Exclude' and 'Include' options can be used together but 'Exclude' takes precedence.

How to Deserialize JSON to C# cherry-picking a small portion of JSON data

JSON deserialization in C# refers to the process of forming up .NET objects from a JSON string. Most of the time, this means creating strongly-typed POCOs. However, there are certain situations when we may prefer flexibility over type-inference. For example, cherry-picking a small portion of JSON data, dealing with external JSON data whose structure is largely unknown or changes very often, etc. Dynamic deserialization comes into play for such cases. This does not necessarily mean the use of language’s inbuilt dynamic keyword. There are other ways as well.We are going to see how we can do this using the native System.Text.Json library and the popular Newtonsoft.Json library.

Source: How to Deserialize JSON Into Dynamic Object in C# – Code Maze

Using telnet as a tool for troubleshooting network port connections

Note that you may need to enable telnet on your workstation (see this Article: How to enable telnet for troubleshooting when CMD reports: “‘telnet’ is not recognized as an internal or external command”)

Once you have telnet enabled, follow these steps:

  1. Open a command prompt
  2. Type in “telnet <IP ADDRESS OF SERVER PC> <PORT>” and press enter.
  3. For example, you would type “telnet 123.45.67.89 1521”
  4. If a blank screen appears then the port is open, and the test is successful.
  5. If you receive a connecting… message or an error message then something is blocking that port.  It could be the Windows firewall, a third party firewall like your anti-virus software, or an institutional hardware firewall between the workstation and the server.

Source: Using telnet as a tool for troubleshooting connection problems on hosted Voyager servers – Ex Libris Knowledge Center

Rxjs debugging subscribers

I wanted to see how many listeners there was for a certain subject, and where they reside in the source code.
Here is how in chrome devtools, put a breakpoint before the subjects .next() call. And inspect the subject:

observers array count = number of “listeners”
FunctionLocation = source code reference

(Context: Angular v11, rxjs)