C# – How to search for files in a directory

You can use Directory.EnumerateFiles() (in System.IO) to search for files in a directory. This has many overloads, allowing you to specify exactly what you want. You can get all the files in a directory, get all files in all subdirectories, filter files by name (including extension), and filter by attributes. Here’s an example of getting … Read more

C# – How to read a file

The simplest way to read a file is to use a high-level method in the .NET File API (in System.IO), such as File.ReadAllText(). These high-level methods abstract away the details of opening a file stream, reading it with StreamReader, and closing the file. Here’s an example of reading a text file’s content using File.ReadAllText(): Notice … Read more

C# – How to create a file and write to it

There are a few ways to create a file and write to it using the .NET File API (in System.IO). The simplest way is to use high-level methods like File.WriteAllText() and File.WriteAllLines(), specifying the file path and string(s) to write to the file. Here’s an example of using these (and their async equivalents): These high-level … Read more

C# – How to delete a file

You can use System.IO.File.Delete() to delete a file by specifying its relative or absolute path. Here’s an example: Note: Unlike other methods in the File API, there’s no async version of File.Delete(). If the specified file exists and the permissions are right, then File.Delete() deletes the file as expected. If there’s a problem, it throws … Read more

ASP.NET Core – Receive a request with CSV data

There are two ways to receive CSV data in a web API: Receive CSV as a file in a multipart/form-data request. Receive CSV as a string in a text/csv request. In this article, I’ll show examples of both of these approaches. I’ll be using the CsvHelper library to parse CSV data into model objects and … Read more

Get data from an API in React

In this article, I’ll show how to make a request to an API to get data and then display it in a React component. This can be broken down into three steps: Initialize two state variables with useState(): one for the data, one for errors. Make the API request with axios in useEffect() and set … Read more

ASP.NET Core – How to unit test a custom InputFormatter

In this article, I’ll show how to unit test a custom InputFormatter. The main thing to test is the output of the ReadRequestBodyAsync() method. To test this, you have to pass in an InputFormatterContext object containing the request body. As an example, I’ll show how to unit test the following ReadRequestBodyAync() method: Note: This is … Read more

How to set the Content-Type header in Postman

In order to add content in the Body tab, you have to first select a content type option (none, form-data, etc…). When you select the type and add content, Postman automatically generates the Content-Type header. You can see the auto-generated Content-Type header in the Headers tab. The following table shows what Content-Type header value is … Read more

ASP.NET Core – How to receive requests with XML content

Receiving requests with XML content is straightforward. You have to register the built-in XML InputFormatter (otherwise you get 415 – Unsupported Media Type errors). When a request comes in with an XML Content-Type (such as application/xml), it uses this InputFormatter to deserialize the request body XML. In this article, I’ll show step-by-step how to receive … Read more

ASP.NET Core – How to receive a request with text/plain content

When a request comes in and your action method has parameters, the framework tries to find the appropriate InputFormatter to handle deserializing the request data. There’s no built-in text/plain InputFormatter though, so when you send a request with text/plain content, it fails with a 415 – Unsupported Media Type error response. In this article, I’ll … Read more

ASP.NET Core – Only one parameter per action may be bound from body

When you have multiple parameters on an action method that are bound to the request body (implicitly or explicitly), you get the following fatal exception upon starting the web API: System.InvalidOperationException: Action ‘RecipeController.Post’ has more than one parameter that was specified or inferred as bound from request body. Only one parameter per action may be … Read more

ASP.NET Core – Four basic ways to receive parameters

There are four basic ways to receive parameters in an ASP.NET Core Web API: query strings, path parameters, request body, and request headers. I’ll show examples of these below. Query string parameters Let’s say you have two query string keys: name and servings. To add these query string parameters, add method parameters with names that … Read more

C# – How to send synchronous requests with HttpClient

In .NET 5 and above, you can use the HttpClient Sync API methods – Send() and ReadAsStream() – to send HTTP requests synchronously (as opposed to resorting to sync-over-async). Here’s the steps for doing this: Create an instance of HttpRequestMessage. Use the synchronous HttpClient.Send() to send the message. Use the synchronous HttpContent.ReadAsStream() to get the … Read more

C# – Configuring CsvHelper when the header names are different from the properties

When your CSV header names don’t match your property names exactly, CsvHelper will throw an exception. For example, if your header name is “title” and your property name is “Title”, it’ll throw an exception like: HeaderValidationException: Header with name ‘Title'[0] was not found. If you don’t want to (or can’t) change the names to match, … Read more

C# – Using CsvHelper when there’s no header row

In this article, I’ll show how to configure CsvHelper to map CSV fields to the right properties when there’s no header row. At the end, I’ll show the alternative approach of manually parsing in this scenario. Consider the following CSV data without a header row: Normally, CsvHelper maps fields to properties by matching column names … Read more

C# – ConfigurationSection.Get() returns null

When you use ConfigurationSection.Get() to load an object from appsettings.json, it returns null if the section doesn’t exist. Since you’re probably not expecting this to be null, this can lead to problems surfacing in unexpected places, such as getting a NullReferenceException: Note: If you’re using ASP.NET Core, you’ll be referring to the config via builder.Configuration … Read more

C# – Parsing a CSV file

In this article, I’ll show how to parse a CSV file manually and with a parser library (CsvHelper). Let’s say you have the following CSV file: To manually parse this, split each line with a comma and process the fields in the resulting string[] however you want. If there’s a header row, skip it (headers … Read more