I have a .Net API with EF core, i generated the endpoints automatically from the models. Now i have a problem with the put method. when i send my model to the API i get a error 500 response back, when i try it within Swaggers i get an error 400 response. I feel that there’s something wrong with the way i setup my models but i can’t figure out what it exactly is.
API:
group.MapPut("/{id}", async Task<Results<Ok, NotFound>> (int id, User user, DataContext db) =>
{
var affected = await db.User
.Where(model => model.Id == id)
.ExecuteUpdateAsync(setters => setters
.SetProperty(m => m.Id, user.Id)
.SetProperty(m => m.Name, user.Name)
.SetProperty(m => m.Company, user.Company)
.SetProperty(m => m.Department, user.Department)
.SetProperty(m => m.Email, user.Email)
.SetProperty(m => m.Password, user.Password)
);
return affected == 1 ? TypedResults.Ok() : TypedResults.NotFound();
})
.WithName("UpdateUser")
.WithOpenApi();
Front-end:
@code {
[Parameter]
public int? Id { get; set; }
[SupplyParameterFromForm]
public User? user { get; set; }
protected override async Task OnInitializedAsync()
{
if (Id != null)
{
try{
var response = await HttpClient.GetAsync($"https://localhost:7183/api/User/{Id}");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
user = JsonSerializer.Deserialize<User>(json, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
}
catch (Exception ex)
{
// Handle error
Console.WriteLine("Error getting user: " + ex.Message);
}
}
else
{
user ??= new();
}
}
void AddUser()
{
if (Id != null)
{
try
{
var client = new HttpClient();
client.BaseAddress = new Uri("https://localhost:7183/api/User");
var json = JsonSerializer.Serialize(user);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = client.PutAsync($"User/{Id}", content).Result;
NavManager.NavigateTo("/UserOverview");
}
catch (Exception ex)
{
// Handle error
Console.WriteLine("Error adding user: " + ex.Message);
}
}
else
{
try
{
byte[] salt = GenerateSalt();
user.Password = HashPassword(user.Password, salt);
var client = new HttpClient();
client.BaseAddress = new Uri("https://localhost:7183/api/User");
var json = JsonSerializer.Serialize(user);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = client.PostAsync("User", content).Result;
NavManager.NavigateTo("/UserOverview");
}
catch (Exception ex)
{
// Handle error
Console.WriteLine("Error adding user: " + ex.Message);
}
}
}
private string HashPassword(string password, byte[] salt)
{
using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, 10000))
{
byte[] hash = pbkdf2.GetBytes(32); // 32 bytes for SHA256
byte[] hashBytes = new byte[36]; // 32 bytes for hash + 4 bytes for salt
Array.Copy(salt, 0, hashBytes, 0, 4);
Array.Copy(hash, 0, hashBytes, 4, 32);
return Convert.ToBase64String(hashBytes);
}
}
private byte[] GenerateSalt()
{
byte[] salt = new byte[4]; // 4 bytes for salt
using (RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider())
{
rngCsp.GetBytes(salt);
}
return salt;
}
}
Model
namespace CalibrationReportingToolApi.Models
{
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Company { get; set; }
public string Department { get; set; }
public string Email { get; set; }
public string Password { get; set; }
// Relationships
public ICollection<MachineNote> Notes { get; set; }
public ICollection<MachineMaintenance> Maintenances { get; set; }
public ICollection<KnoopCallibratiobIndirect> KnoopCallibratiobIndirects { get; set; }
public ICollection<VickersCallibrationIndirect> VickersCallibrationIndirects { get; set; }
public ICollection<BrinellCallibrationIndirect> BrinellCallibrationIndirects { get; set; }
public ICollection<RockwellCallibrationIndirect> RockwellCallibrationIndirects { get; set;}
public ICollection<VickersCallibrationDirect> VickersCallibrationDirects { get; set; }
public ICollection<BrinellCallibrationDirect> BrinellCallibrationDirects { get; set; }
public ICollection<RockwellCallibrationDirect> RockwellCallibrationDirects { get; set; }
}
}
Error 400 response from Swagger:
Microsoft.AspNetCore.Http.BadHttpRequestException: Failed to read parameter "User user" from the request body as JSON.
---> System.Text.Json.JsonException: The JSON value could not be converted to CalibrationReportingToolApi.Models.KnoopCallibratiobIndirect. Path: $.notes[0].machine.knoopCallibratiobIndirects[0] | LineNumber: 28 | BytePositionInLine: 18.
at System.Text.Json.ThrowHelper.ThrowJsonException_DeserializeUnableToConvertValue(Type propertyType)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.JsonCollectionConverter`2.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, TCollection& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.JsonCollectionConverter`2.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, TCollection& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.ContinueDeserialize(ReadBufferState& bufferState, JsonReaderState& jsonReaderState, ReadStack& readStack)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.DeserializeAsync(Stream utf8Json, CancellationToken cancellationToken)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.DeserializeAsObjectAsync(Stream utf8Json, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.HttpRequestJsonExtensions.ReadFromJsonAsync(HttpRequest request, JsonTypeInfo jsonTypeInfo, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.HttpRequestJsonExtensions.ReadFromJsonAsync(HttpRequest request, JsonTypeInfo jsonTypeInfo, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Http.RequestDelegateFactory.<HandleRequestBodyAndCompileRequestDelegateForJson>g__TryReadBodyAsync|102_0(HttpContext httpContext, Type bodyType, String parameterTypeName, String parameterName, Boolean allowEmptyRequestBody, Boolean throwOnBadRequest, JsonTypeInfo jsonTypeInfo)
--- End of inner exception stack trace ---
at Microsoft.AspNetCore.Http.RequestDelegateFactory.Log.InvalidJsonRequestBody(HttpContext httpContext, String parameterTypeName, String parameterName, Exception exception, Boolean shouldThrow)
at Microsoft.AspNetCore.Http.RequestDelegateFactory.<HandleRequestBodyAndCompileRequestDelegateForJson>g__TryReadBodyAsync|102_0(HttpContext httpContext, Type bodyType, String parameterTypeName, String parameterName, Boolean allowEmptyRequestBody, Boolean throwOnBadRequest, JsonTypeInfo jsonTypeInfo)
at Microsoft.AspNetCore.Http.RequestDelegateFactory.<>c__DisplayClass102_2.<<HandleRequestBodyAndCompileRequestDelegateForJson>b__2>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
HEADERS
=======
Accept: */*
Host: localhost:7183
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: nl-NL,nl;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6,zh;q=0.5
Content-Type: application/json
Cookie: .AspNetCore.Antiforgery.WhNuX7sAGOE=CfDJ8BSIRFuoO3BNpdEx-GB1aMcdvJDP7YxmucuQ8GK_ggdu-Cj8qFYX6LsU-VMaW9feKIgkzw4suXMgBY5VvRdONih2w63wFiJR8W98Zerh9Sn3rsc-ezGGkx9s7jplxqic3WG-tWQASGdc7aXMIwUl12g
Origin: https://localhost:7183
Referer: https://localhost:7183/swagger/index.html
Content-Length: 32469
sec-ch-ua: "Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-site: same-origin
sec-fetch-mode: cors
sec-fetch-dest: empty
priority: u=1, i
content-type: text/plain; charset=utf-8
date: Wed,08 May 2024 07:42:15 GMT
server: Kestrel
I tested my other API endpoints (get, add , delete)these seem to be in a working condition
JuleanCode is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.