.NET Core  

.NET Core with AI Integration

Let's take a look at an example of integrating AI with .NET Core, including code.

Home Screen

Home Screen

Let's create a simple view to interact with the user for questions and answers.

index.cshtml

<h2>Enter your text</h2>

<form method="post">
    <div>
        <textarea id="Message" name="Message" rows="5" cols="40" class="text col-md-5"></textarea>
    </div>
    <br />
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

<br />

<h3>Result :</h3>
@if (Model != null)
{
    <p>@Model</p>
}

The following is the structure of our controller. As you know, it functions like a typical MVC controller for handling user requests and responses.

HomeController.cs

using AIIntegrationDotNetCore.Models;
using AIIntegrationDotNetCore.Services;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;

namespace AIIntegrationDotNetCore.Controllers
{
    public class HomeController : Controller
    {
        //private readonly ILogger<HomeController> _logger;

        private readonly OpenAIService _openAIService;
    
        public HomeController(ILogger<HomeController> logger, OpenAIService openAIService)
        {
            //_logger = logger;
            _openAIService = openAIService;
        }

        [HttpPost]
        public async Task<IActionResult> Index(UserMessageRequest request)
        {
            var reply = await _openAIService.GetChatCompletionAsync(request.Message);
            ViewBag.Message = reply;
            return View("Index", reply);
        }

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }

        public class UserMessageRequest
        {
            public string Message { get; set; }
        }
    }
}

Most importantly, there is a separate service class to handle communication with the AI.

using System.Net.Http.Headers;
using System.Text.Json;
using System.Text;

namespace AIIntegrationDotNetCore.Services
{
    public class OpenAIService
    {
        //private readonly HttpClient _httpClient;
        private readonly IConfiguration _configuration;

        public OpenAIService(HttpClient httpClient, IConfiguration configuration)
        {
            //_httpClient = httpClient;
            _configuration = configuration;
        }

        public async Task<string> GetChatCompletionAsync(string userMessage)
        {
            var apiKey = _configuration["Gemini:ApiKey"];
            var apiUrl = _configuration["Gemini:ApiUrl"];

            string requestBody = @"{
                ""contents"": [{
                    ""parts"":[{ ""text"": """ + userMessage + @""" }]
                }]
            }";

            using var client = new HttpClient();
            var request = new HttpRequestMessage(HttpMethod.Post, $"{apiUrl}?key={apiKey}");
            request.Content = new StringContent(requestBody, Encoding.UTF8);
            request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var response = await client.SendAsync(request).ConfigureAwait(false);

            if (response.IsSuccessStatusCode)
            {
                string responseBody = await response.Content.ReadAsStringAsync();
                using JsonDocument doc = JsonDocument.Parse(responseBody);

                JsonElement root = doc.RootElement;

                var text = root
                    .GetProperty("candidates")[0]
                    .GetProperty("content")
                    .GetProperty("parts")[0]
                    .GetProperty("text")
                    .GetString();

                return text != null ? text : "No response";
            }
            else
            {
                return $"Error: {response.StatusCode} - {response.ReasonPhrase}";
            }
        }
    }
}

Here is the structure of the appsettings.json file. You must create your own key and replace it here for the example to work properly.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Gemini": {    
    "ApiKey": "***************************************",
    "ApiUrl": "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent"
  }
}

You can explore more in this example as per your requirements.

Thanks!

Happy Coding!!