Allowing Azure DevOps Release Pipelines Access to Remote Artifacts

A screenshot of the Azure DevOps project summary screen with the "Project settings" navigation item highlighted

If you’re using Azure DevOps for your continuous integration/continuous deployment (CI/CD) pipelines you may have stumbled across a pretty cool feature: you can create a build pipeline artifact in one project and import it into the release pipeline of another project! I use this to build a utility once and then import it into several other projects to avoid having to build it several times and trying to maintain settings in multiple places.

The issue is that the first time I tried using this approach, I received the following error:

2022-05-31T06:42:42.2517765Z ##[section]Starting: Download artifact - _Utility App - Utility App
2022-05-31T06:42:42.3632226Z ==============================================================================
2022-05-31T06:42:42.3632956Z Task         : Download build artifacts
2022-05-31T06:42:42.3633439Z Description  : Download files that were saved as artifacts of a completed build
2022-05-31T06:42:42.3633715Z Version      : 0.200.1
2022-05-31T06:42:42.3634068Z Author       : Microsoft Corporation
2022-05-31T06:42:42.3634549Z Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/download-build-artifacts
2022-05-31T06:42:42.3634953Z ==============================================================================
2022-05-31T06:42:49.0078464Z Error: in getBuild, so retrying => retries pending  : 4
2022-05-31T06:43:34.1171511Z Error: in getBuild, so retrying => retries pending  : 3
2022-05-31T06:45:49.4315894Z Error: in getBuild, so retrying => retries pending  : 2
2022-05-31T06:51:49.7774413Z Error: in getBuild, so retrying => retries pending  : 1
2022-05-31T06:57:49.9960407Z ##[error]Failed in getBuild with error: Error: VS800075: The project with id 'vstfs:///Classification/TeamProject/{GUID}' does not exist, or you do not have permission to access it.
2022-05-31T06:57:50.0533271Z ##[error]Error: VS800075: The project with id 'vstfs:///Classification/TeamProject/{GUID}' does not exist, or you do not have permission to access it.
2022-05-31T06:57:50.0572339Z ##[section]Finishing: Download artifact - _Utility App - Utility App

I couldn’t find a clear answer for how to fix it but managed to get there with some trial and error!

Continue reading “Allowing Azure DevOps Release Pipelines Access to Remote Artifacts”

Null Reference Exception in Blazor Router

A screenshot of a stack trace produced from a .NET application. The main messages are "An unhandled exception occurred while processing the request. NullReferenceException: Object reference not set to an instance of an object. Microsoft.AspNetCore.Components.Routing.Router.Refresh(bool isNavigationIntercepted)". A full stack trace is visible below.

If you’ve used Blazor for a while you may have run into the following (pretty unhelpful) error message where the page router is throwing a NullReferenceException:

A screenshot of a stack trace produced from a .NET application. The main messages are "An unhandled exception occurred while processing the request. NullReferenceException: Object reference not set to an instance of an object. Microsoft.AspNetCore.Components.Routing.Router.Refresh(bool isNavigationIntercepted)". A full stack trace is visible below.
But what am I trying to reference that is null?!

The worst part is that I always seem to run into this error after making a bunch of changes and then having no idea exactly what I did to break the build (yeah I know, I should probably run my code more while making changes).

I’ve managed to form a general idea of why the error is thrown and have found two concrete situations that reproducibly cause the issue, so I’ve finally written them down for when I inevitably run into this situation again!

Continue reading “Null Reference Exception in Blazor Router”

Applying Authorisation Rules to a Folder of Razor Components/Blazor Pages

A screenshot of a Blazor app designed to test/demonstrate different approaches to applying authorisation rules to razor components

There’s a lot of flexibility in how you can use authorisation rules in Razor components*, but a frustration of this approach is that it seems like you have to slap @attribute [Authorize(Policy = "PolicyName")] at the top or every page with no clear way of applying a given policy to a whole folder of .razor files. After much research and testing, I’ve found how to go about it!

Continue reading “Applying Authorisation Rules to a Folder of Razor Components/Blazor Pages”

Calling .NET Instance Methods in ASP.NET Core Blazor Directly from JavaScript

A header image depicting an arrow pointing from the JavaScript logo to the Blazor logo

I ran into an issue recently where I needed to call some C# code from JavaScript. The Microsoft documentation on JavaScript to .NET interop is very detailed and covers a lot of scenarios including the one that would seem to fit the bill (invoking instance methods), but my requirements meant that I couldn’t use this exact approach.

Continue reading “Calling .NET Instance Methods in ASP.NET Core Blazor Directly from JavaScript”

UI Flashes after Migrating Blazor Projects To .NET 6

A table with the title of "Vegetables". There are three columns (Id, Product and Quantity) and 3 rows of example data.

The Problem

I’ve noticed an issue recently after upgrading a few Blazor projects from .NET 5 to .NET 6 where the UI flashes after every call to StateHasChanged. Something like this:

A table with the title of "Vegetables". There are three columns (Id, Product and Quantity) and 3 rows of example data. The Id field disappears and reappears once a second causing the table to visibily shift back and forth
Flash. Flash. Flash. Flash…

Yeah, that’s not annoying at all. Unfortunately it was happening in quite a few different places and was pretty darn noticeable, so it looked like I was going to have to dive in and figure out what exactly was causing this to go wrong (despite working perfectly in .NET 5)!

Continue reading “UI Flashes after Migrating Blazor Projects To .NET 6”

Referencing Blazorise Theme Values in Custom CSS

A header image displaying two different div elements with two differently coloured shadows

Introduction

Blazorise is an excellent library that I’ve been using a lot lately. While it has great support for declaring custom visual themes, you’ll occasionally run into situations where what you’re trying to do isn’t fully supported.

Take this super contrived example: I want to set the shadow on a div to use the primary colour defined in my theme, but there’s no attribute in Blazorise to do this directly (at time of writing). I could hard-code the colour to the same hex value as what I’ve set in my theme, but not only is this generally bad practice (since it’s easy to update one value and not the other), it locks you into only one colour even though the theme can be modified dynamically during runtime. So how can we access our Blazorise theme values in custom CSS?

Continue reading “Referencing Blazorise Theme Values in Custom CSS”

Migrating ASP.NET Core Development Secrets out of appsettings.json

A banner showing an appsettings file filled with fake secrets transforming into one with blank secrets

I’m sure I’m not the only one that has “temporarily” stored passwords, application keys or other development secrets in appsettings.json simply because it was easier or faster than doing it the right way (although if I am, this first sentence will surely come back to haunt me).

I get it. It happens! This blog post actually comes from my efforts to update a project I’m working on with some friends so that we’ve got a more consistent approach to keeping secrets… secret.

So how are we going to go about this? We’ll be using Secret Manager, a fantastically helpful tool built into the configuration API in ASP.NET Core that will let us keep the secrets out of appsettings while not require a change to how we access the settings in code. Sound good?

Continue reading “Migrating ASP.NET Core Development Secrets out of appsettings.json”

Multi-Factor Authentication with Password and Private Key File in SSH.NET

If you want to use SSH.NET to connect to an SFTP server that requires both a password and a private key file, you’ll be happy to know that it is well supported! Unfortunately (and similar to my previous SSH.NET post about modifying the Host Key Algorithm) the documentation doesn’t really make it clear how to do this.

Continue reading “Multi-Factor Authentication with Password and Private Key File in SSH.NET”

Regular Expression Tips for People That Hate Regular Expressions

A screenshot of a code editor. There are three lines, setting the variables "isCustomerNumber", "isProductNumber" and "isTransactionNumber" based on whether a series of regular expression (regex) matches succeed

I’ve been writing regular expressions (regex) for years and would consider myself pretty good at them by now (I decline to provide references). The problem is that although it’s common to see regex as cryptic and painfully terse (which are not invalid points), they remain one of the best ways to handle complex pattern matching and as such you’ll probably run into them at least a few times in your career.

Even if you really despise writing regular expressions, here are some tips that will help to make that process as painless as possible!

Continue reading “Regular Expression Tips for People That Hate Regular Expressions”

Epson ET-2711/ET-2710 Series Printer Wireless Setup Made Easy

A photo of an Epson ET-2711 printer

If you want to just get to the good stuff, scroll down to the “Setup” section.

My wife and I finally got a new printer to replace the old one that has pretty much given up the ghost and refuses to print anymore (often considered an important feature for devices like this).

We settled on an Epson ET-2711 in large part because of the ink tank that should (hopefully) do away with the constant stream of expensive cartridges in favour of some cheaper-per-page ink bottles. I was excited to get it out and start setting it up (in part because we’re in another lockdown and what else is there to do right now)!

Imagine my frustration, dear reader, when I found out that the whole wireless setup process for this printer is terrible if you follow the official instructions. I genuinely spent a couple of hours bouncing between the Android app (which gave me a very helpful message telling me “Communication error”, to check the printer is on and not much else), the included software for Windows (which was just as helpful), the printed documentation in the box and the website, all to no avail.

You cannot convince me that this is a helpful error message

The good news is that I finally figured out how to get it working. The even better news for you at home is that I’ve gone through the process three times so that I could document all of the steps to get this working properly!

Continue reading “Epson ET-2711/ET-2710 Series Printer Wireless Setup Made Easy”