We had an issue a couple of days ago where two points of failure caused some downtime and so I spent most of today revisiting all my monitors to give us as much warning as possible if one of our services fails.
One particular API I set up lives on the as400 (iSeries) and operates off of it’s ZendCore server in PHP. I quickly scripted a page to verify: connection between ZendCore PHP and db2, that the connection to that endpoint was in fact SSL, and on what port.
The PHP code is very simple and returns a JSON string that looks like this:
The slight problem today was figuring out how to get Site 24×7 to not just verify the link, but check the JSON values and verify it is what I need. If not, then send the alert. In this case, I want to verify AS400CONNECTION is true and SSL is true.
Site 24×7 suggests using a REST API monitor and then asserting the value in JSONPath. I was completely new to this and finding a good clean example was a bit tough, hopefully this saves someone some time. Here’s …
As noted, I work with Legacy and often have to bring in variables from the API that must be sustained across session.. (and I’m sure there might be a better way, comment and advise!). Where I am at now, is I query the API and bring in the variables, but how do I keep from calling these over and over? The old solution was session variables and so, that’s where I am at.
When I started to do this on Core, the most helpful article was this (and it’s in my comments):
He leads you through the basic setup of a HttpContext helper class (that I still use today) and how to configure the startup.. Today, though, I came across a problem: I was able to Set session variables, but the Get was pulling null.
Order. Yes, you’ll see 1000 stackflow responses about order in Configure (and I was careful to do this in that method), but now in ConfigureServices (contrary to the example, as I am now using Core 2.2?), order again comes into play:
public void ConfigureServices(IServiceCollection services)
//this MUST be before add mvc or session returns null
I’ve recently been curious about switching to a time API for my time stamps and removing any dependency the app might have on the server for a timestamp. Upon Googling I found some paid services, some free and of the free ones, I noticed one was hosted on Heroku. I’ve heard of Heroku, but never had a reason to attempt to use it. This was the perfect chance.
How I Created a Small “GetTime” API
First, I created a free account on Heroku, nothing special. After verifying my email, I logged in to my Heroku Dashboard and up on the right hand corner, selected Create New App. I named it my company-api and out popped an app.
I decided on just plain, legacy PHP and a simple DateTime string passed thru JSON encode, just to get started. No authentication, no timezone, just a simple spit out if a request to the site came, like this:
$DateTime = new DateTime();
$currentTime = $DateTime->format("Y-m-d H:i:s");
I created a Git repo for this brand new file and pushed it out. Then, I went back to Heroku, Dashboard, My App and Deploy. I selected Github as my deploy “resource” …
The idea behind this was to create a nice, easy UI that users can download media files they request often. We moved it to Azure to prevent killing our on-prem bandwidth, but then I had to deal with the flat file structure, etc. The end result was simply: a fast search of all the blobs (with link) and underneath that, a tree structure of the blobs that they can browse through.
The Set Up
First, I created a Storage container through Azure Portal, then I used Azure Storage Explorer to create a Blob Container under that storage account. I also set read-only permissions to my blobs by right clicking the container in Azure Storage Explorer, then: Set Container Public Access Level > Public Read Access for Blobs Only.
To make this code work, I needed to setup an environment variable for my connection string. I used the prefix CUSTOMCONNSTR_ on my variable name as it comes in handy when deploying to Azure Web Apps. To get the connection string: Azure Portal > Storage Account you created > Access Keys.
setx CUSTOMCONNSTR_storageConnectionString "<yourconnectionstring>"
Finally, I got a folder I wanted to share and dragged and dropped it into my …
I began hearing about live code streams a year or so ago on LiveEdu.TV and saw a livestream with Jeff Fritz at DevIntersection, but I decided to become a regular on a stream DevChatter a few months ago to really see how it could improve my own code.
Build a Community
I specifically joined the DevChatter stream because they had a Discord chat. I wasn’t familiar with Discord, but I’ve spent time on IRC. I was expecting 3 months of ignoring, bad advice, trolling to make me go away, you know – the standard IRC vetting experience. DevChatter’s Discord was actually VERY welcoming!
I like that they have a General chat but also VERY specific chats, like #azure, #dotnet, #php and.. #rants.
Regular dev’s go onto Discord asking for random code help, spit ideas off each other or just to rant about the problem of the day: the bug that wouldn’t go away, the pains of working with legacy, the random programming problem that won’t leave your mind…
Every portion of that Discord chat lends you a bit of insight into this person. You figure out what timezone they are in, what languages and systems they work with. You …
The API mentioned in my first tutorial got taken down and so I had to do some updates. First, choose another 3rd party API. I currently am trying out HTML 2 PDF Rocket and modified my code a bit:
public async Task<FileStreamResult> PrintAsync(int id)
InvoiceVM invoiceVM = new InvoiceVM();
invoiceVM = invoiceRepository.Get(id);
var engine = new RazorLightEngineBuilder()
.UseFilesystemProject(_hostingEnvironment.WebRootPath + "\\pdf\\")
var view = await engine.CompileRenderAsync("PDF.cshtml", invoiceVM);
string apiKey = "xxxxxxxxxxxxxxxxxxxx";
using (var client = new WebClient())
// Build the conversion options
NameValueCollection options = new NameValueCollection();
MemoryStream ms = new MemoryStream(client.UploadValues("http://api.html2pdfrocket.com/pdf", options));
return new FileStreamResult(ms, "application/pdf");
This is based directly off the HTML 2 Rocket documentation. For the rest of the code see the first tutorial.