How to generate absolute URLs in ASP.NET Core
Tags: dotnet, aspnet, csharp
Published: 2022-04-19 18:56:25

---
title: How to generate absolute URLs in ASP.NET Core
published: true
date: 2022-04-19 00:00:00 UTC
tags: dotnet, aspnet, csharp
canonical_url: https://swimburger.net/blog/dotnet/how-to-generate-absolute-urls-in-aspdotnet-core
---

URLs are what makes the web the web. In ASP.NET Core Controllers, Razor Pages, and Razor views, there's a `Url` property which gives you access to the `UrlHelper`. Using the `UrlHelper` you can generate URLs to MVC actions, pages, and routes. Take a look at this C# expression:

```csharp
Url.Action(action: "Home", controller: "Privacy")
```

The result of this expression will be a URL string pointing to the `Privacy` action on the `HomeController`: `"/Home/Privacy"`.

This is only the absolute path, but that is a valid URL and should work fine. However, sometimes you want to get the absolute URL which includes the scheme, the hostname or domain name, and the port. For this purpose, the methods on the `UrlHelper` have overloads to specify the `protocol` which is the scheme, and the `host` which is the hostname or domain name. Take a look at this C# expression:

```csharp
Url.Action(action: "Home", controller: "Privacy", values: null, protocol: "https", host: "your-website")
```

By specifying the protocol and host, the result is now `"https://your-website/Home/Privacy"`.

However, if you omit the `host` parameter but keep the `protocol` parameter, the result will still be an absolute URL, because the `host` parameter will default to the host used for the current HTTP request.

```csharp
Url.Action(action: "Home", controller: "Privacy", values: null, protocol: "https")
```

The result will be something like `"https://localhost:7184/Home/Privacy"`. Whatever the host and port used to make this HTTP request will be used to generate this URL.

When you're handling an HTTP request in ASP.NET Core, you can also access the `Scheme` property on the `HttpRequest`, so you could pass the scheme as the `protocol` parameter to generate the URL with same scheme and host as the current HTTP request.

```csharp
Url.Action(action: "Privacy", controller: "Home", values: null, protocol: Request.Scheme)
```

You could also pass in `Request.Host` as the `host` parameter, but you don't need to as it already uses the host from the current HTTP request when you specify the `protocol` without specifying the `host` parameter.

**What if you don't have access to the `UrlHelper` or you need to build a URL in a way that the `UrlHelper` doesn't support?**

You can also create the absolute base URL for the current HTTP request by grabbing the properties from the `HttpRequest`. The following code builds the absolute URL for the absolute path "/your/custom/path":

```csharp
$"{Request.Scheme}://{Request.Host}{Request.PathBase}/your/custom/path"
```

The result of this expression looks like `"https://localhost:7184/your/custom/path"`.  
If you need the full absolute URL including the current absolute path, you could use the following C# expression:

```csharp
$"{Request.Scheme}://{Request.Host}{Request.PathBase}{Request.Path}"
```

**What if there's no HTTP request?**

If there is no HTTP request that you're handling in your code, like when you're doing some background processing using a `BackgroundWorker`, you'll need to get the scheme and host some other way. You could store your desired scheme and host into your configuration, or combine them together in a single property and store it into your configuration. Once configured, extract it from configuration and use it to build your absolute URL.

## Conclusion

By default, the `UrlHelper` methods will generate absolute paths which isn't the same as a full absolute URL because it doesn't contain the scheme, hostname, and port number. However, the `UrlHelper` methods do contain overloads which allow you to generate the full absolute URL.

You can also manually build the absolute URL using the `HttpRequest` properties or by storing the desired scheme and hostname from configuration and then extracting it.

In most cases, using an absolute path will be sufficient and it'll save some characters in your HTML, but absolute URLs are sometimes required such as for the technical SEO and social meta tags.