Skip to main content
All docs
V23.2

Azure Functions App (Linux) with DevExpress Reporting - Create and Deploy

  • 5 minutes to read

In this topic, you will learn how to create and deploy an Azure Functions project that generates a report based on user input and exports the report to a PDF file. This tutorial uses command-line utilities.

Prerequisites

  1. An Azure account with an active subscription.
  2. The latest version of Azure Command-Line Interface (CLI). For instructions, review the following topic: Install Azure CLI on Windows.
  3. Azure Functions Core Tools
  4. Your personal DevExpress NuGet credentials. Refer to the following help topic for instructions on how to obtain the feed URL and authorization key, and register the online NuGet feed in your development environment: Choose Between Offline and Online DevExpress NuGet Feeds.

Important Disclaimer

The deployment recommendations do not apply to all possible configurations and should not be considered comprehensive. We offer these instructions as a getting-started reference. Steps may vary depending on your operating system, installed software, and DevExpress versions. You, the developer, are responsible for the application, database, network, and other configurations based on your client, security, environment, and other requirements. We recommend that you review these settings with your database, network, and IT infrastructure administrators and consider tailoring their recommendations to your case.

Create a New Azure Functions Project Using Template

This section uses Azure Functions Core Tools commands to create, manage, and deploy an Azure Functions project. For more information, review the following document: Azure Functions Core Tools reference.

  1. To create a new Azure functions project, you can run the func init command. The func init command prompts you to select a language runtime for the application and customizes the contents of the project folder based on that.

    This tutorial uses a command to create a folder with the DXReportingAzureFuncExport project. The isolated worker model is specified because it is flexible and adaptable to many applications. For more information, review the following document: Guide for running C# Azure Functions in an isolated worker process.

    Run the following command to create a project:

    func init DXReportingAzureTestFunc --worker-runtime dotnet-isolated
    
  2. Create a new function TestExportFunction that uses an HTTP trigger to invoke a function with an HTTP request. It is important to note that functions may require authorization for an HTTP trigger. In this example, the authorization level is set to anonymous.

    To run the command, change to the project folder. Enter the following:

    cd DXReportingAzureTestFunc
    func new --template "Http Trigger" --name TestExportFunction --authlevel anonymous
    

Add NuGet Packages to the Project

To use DevExpress Reporting components, you should install NuGet packages using the following commands:

dotnet add package DevExpress.Reporting.Core
dotnet add package DevExpress.Drawing.Skia

Add the ForceSkia Method Call

Open Program.cs file using any text editor and add a call to the DevExpress.Drawing.Internal.DXDrawingEngine.ForceSkia method to force Skia-based rendering:

using Microsoft.Extensions.Hosting;
using System.Runtime.InteropServices;

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .Build();

if(!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
    DevExpress.Drawing.Internal.DXDrawingEngine.ForceSkia();
}

host.Run();

Create a Test Report

The application loads a report from a .REPX file, passes parameters specified in the query string, exports the report to PDF, and displays the resulting PDF in the browser. The report is a conference ticket that contains the owner’s name from the query string, a linear bar code, and a QR code to verify the quality of the print.

Ticket Report in a Report Designer

The report is created in DevExpress Report Designer and is saved to the TestReport.repx XML file.

Reference a Report in the Azure Function Project

Copy the TestReport.repx file to the project root folder. Include a report file to the project as a resource. To do this, open the DXReportingAzureTestFunc.csproj file using a text editor and add the following tags:

  <ItemGroup>
    <EmbeddedResource Include="TestReport.repx">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </EmbeddedResource>
  </ItemGroup>

Implement TestExportFunction

Using any text editor, open the TestExportFunction.cs file and replace the Run method with a custom implementation. The modified file should contain the following content:

using System.Net;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;

namespace DXReportingAzureTestFunc {
    public class TestExportFunction {
        private readonly ILogger _logger;

        public TestExportFunction(ILoggerFactory loggerFactory) {
            _logger = loggerFactory.CreateLogger<TestExportFunction>();
        }

        [Function("TestExportFunction")]
        public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req) {
            _logger.LogInformation("C# HTTP trigger function processed a request.");

            var firstName = req.Query.GetValues("firstName")?.FirstOrDefault();
            var lastName = req.Query.GetValues("lastName")?.FirstOrDefault();

            if(string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName)) {
                var response = req.CreateResponse(HttpStatusCode.BadRequest);
                response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
                await response.WriteStringAsync("Required query parameters are missing: 'firstName', 'lastName'.");
                return response;
            }

            using var ms = new MemoryStream();
            var currentAssembly = System.Reflection.Assembly.GetAssembly(typeof(TestExportFunction)); 
            Stream fileStream = currentAssembly.GetManifestResourceStream(typeof(TestExportFunction),"TestReport.repx");
            using var report = new DevExpress.XtraReports.UI.XtraReport();
            report.LoadLayoutFromXml(fileStream);
            report.Parameters["firstName"].Value = firstName;
            report.Parameters["lastName"].Value = lastName;
            await report.ExportToPdfAsync(ms);
            var okResponse = req.CreateResponse(HttpStatusCode.OK);
            okResponse.Headers.Add("Content-Type", "application/pdf; charset=utf-8");
            await okResponse.WriteBytesAsync(ms.ToArray());

            return okResponse;
        }
    }
}

Tip

You can use Visual Studio Code to edit, debug, run, and publish Azure Functions. Review the following document for more information: Develop Azure Functions by using Visual Studio Code.

Test Azure Functions Locally

Run the following command to build and run the project on a local host:

func start

Publish the Project

  1. Log in to Azure if you are not already logged in:

    az login
    

    The authentication process launches a browser window and begins Microsoft authentication.

  2. Open the Microsoft Azure portal. Create a new Function App in any available group. Specify a unique name for the Function App.

    DxReportingExportTest Function App in Azure Portal

  3. Run the following command in the project folder to zip deploy the local DXReportingAzureTestFunc project to the DxReportingExportTest Function App in the Azure cloud:

    func azure functionapp publish DxReportingExportTest
    

Test the Published Application

After publishing succeeds, the console shows the function’s invoke URL. In this example, the URL is https://dxreportingexporttest.azurewebsites.net/api/testexportfunction.

To test the application, enter the following URL into your browser:

https://dxreportingexporttest.azurewebsites.net/api/testexportfunction?firstName=John&lastName=Doe

The function runs and the browser opens resulting PDF content:

Azure Functions App PDF Result