Home > Software engineering >  .NET API POST Endpoint not getting hit
.NET API POST Endpoint not getting hit

Time:11-30

I have a .net api and I want to test the api from a console app. The method I am trying to test is a POST Method.I serialize data from my console app into a json string and I want to post it to the API, but the API does not get hit and I dont get any errors from my console app.

My GET calls work though. It is just the post I cant get to work.

My API Controller->

using _ErrorLogger.Shared;
using _ErrorLogger.Server.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Runtime.CompilerServices;

namespace _ErrorLogger.Server.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ExceptionDetailsController : ControllerBase
    {
        private readonly IExceptionDetailsService _exceptionDetailsService;
        public ExceptionDetailsController(IExceptionDetailsService exceptionDetailsService)
        {
            _exceptionDetailsService = exceptionDetailsService;
        }

        [HttpGet]
        [Route("GetExceptions")]
        public async Task<List<ExceptionDetails>> GetAll()
        {
            return await _exceptionDetailsService.GetAllExceptionDetails();
        }

        [HttpGet]
        [Route("GetExceptionByID/{id}")]
         public async Task<ExceptionDetails> GetByID(int id)
        {
            return await _exceptionDetailsService.GetExceptionDetails(id);
        }

        [HttpPost]
        [Route("CreateException")]
        public async Task<IActionResult> CreateException([FromBody]string obj)
        {
            //await _exceptionDetailsService.AddExceptionDetails(exceptionDetails);
            return Ok();
        }

        [HttpPost]
        [Route("Test")]
        public async Task<IActionResult> Test([FromBody] string obj)
        {
            return Ok();
        }
    }
}

My Call from the console app ->

public async void ExceptionsAnalyzer(Exception exception)
        {
            HttpClient _httpClient = new HttpClient();

            StackTrace stack = new StackTrace(exception, true);

            StackFrame frame = stack.GetFrame(stack.FrameCount - 1);

            ExceptionDetails exceptionDetails = new ExceptionDetails
            {
                ExceptionMessage = exception.Message,
                InnerException = exception.InnerException?.ToString(),
                ExceptionType = exception.GetType().ToString(),
                ExceptionSourceFile = frame.GetFileName(),
                ExceptionSourceLine = frame.GetFileLineNumber().ToString(),
                ExceptionCaller = frame.GetMethod().ToString(),
                ExceptionStackTrace = exception.StackTrace,
                DateLogged = DateTime.Now

            };

            string json = JsonSerializer.Serialize(exceptionDetails);
            //var stringContent = new StringContent(json, Encoding.UTF8, "application/json");

            HttpResponseMessage response = await _httpClient.PostAsJsonAsync("http://localhost:5296/api/ExceptionDetails/CreateException", json);
            if (response.IsSuccessStatusCode)
            {

            }
        }

I am Expecting the api endpoint to be hit.

CodePudding user response:

I am Expecting the api endpoint to be hit.

Well, Firstly, your method in console app which is ExceptionsAnalyzer structure is wrong. It should be type of static because, main method within console app itself is type of static.

Another mistake is async should be type of Task and while calling the ExceptionsAnalyzer method it should be wait() for response but your console app is static so how it would handle await call? So see the solution below:

Solution:

    using System.Net.Http.Json;
    using System.Text.Json;
    
  // Calling method   
    ExceptionsAnalyzer().Wait();
  //Defining Method in dotnet 6 console app    
    static async Task ExceptionsAnalyzer()
    {
        HttpClient _httpClient = new HttpClient();
        var obj = "Test data";
        string json = JsonSerializer.Serialize(obj);
        HttpResponseMessage response = await _httpClient.PostAsJsonAsync("http://localhost:5094/api/ExceptionDetails/CreateException", json);
        if (response.IsSuccessStatusCode)
        {
    
        }
    }

Note: I haven't consider your parameter Exception exception which you can modify yourself. I am mostly considering why you cannot get to hit API Endpoint. Hope you now got the mistake.

Output:

enter image description here

CodePudding user response:

Unless ExceptionDetails is part of your basepath and as such is included for all API calls, I think you need to remove that.

You defined the route to the call as CreateException, so the url should be <base url>/CreateException

If that doesn't help, please post the code of your entire controller (with endpoint method).

  • Related