- ABP Framework version: v7.4
- UI Type: Blazor WASM
- Database System: EF Core (SQL Serve(
- Tiered (for MVC) or Auth Server Separated (for Angular): yes/no
- Exception message and full stack trace:
- Steps to reproduce the issue:
we have an Entity that inherit from FullAuditedEntity<int>, IHasConcurrencyStamp as follow
public abstract class TieredLayerBase : FullAuditedEntity<int>, IHasConcurrencyStamp
{
[NotNull]
public virtual string TieredLevelName { get; set; }
public virtual decimal LowerLimit { get; set; }
public virtual decimal? UpperLimit { get; set; }
public virtual decimal Rate { get; set; }
public int? BillingItemId { get; set; }
public string ConcurrencyStamp { get; set; }
}
} and DTO than
public class TieredLayerCreateOrUpdateDto : FullAuditedEntityDto<int>, IHasConcurrencyStamp {
//public int? Id { get; set; }
[Required]
public string TieredLevelName { get; set; } = null!;
public decimal LowerLimit { get; set; }
public decimal? UpperLimit { get; set; }
public decimal Rate { get; set; }
public int? BillingItemId { get; set; }
public string? ConcurrencyStamp { get; set; } = null!;
}
AppService Interface as follow :Task<List<TieredLayerDto>> CreateTieredLayerToBillingItemAsync(List<TieredLayerCreateOrUpdateDto> tieredLayerCreateOrUpdateDtos);
and calling from blazor as follow await TieredLayersAppService.CreateTieredLayerToBillingItemAsync(NewTieredLayerList);
and we getting unsupported media type error message
12 Answer(s)
-
0
Can you provide the error logs?
-
0
it is solved by separating the UpdateDto and the CreateDto, however, the use case is that we need to send a list of CreateOrUpdateDto to the Appservice and the decision should be taken there based on the Id value.
in the browser is mentioned invalid value
log is below
2023-10-25 15:14:10.123 -04:00 [WRN] ---------- RemoteServiceErrorInfo ---------- { "code": null, "message": "Your request is not valid!", "details": "The following errors were detected during validation.\r\n - The tieredLayerCreateOrUpdateDto field is required.\r\n - '0x0A' is invalid within a JSON string. The string should be correctly escaped. Path: $[0] | LineNumber: 8 | BytePositionInLine: 5.\r\n", "data": {}, "validationErrors": [ { "message": "The tieredLayerCreateOrUpdateDto field is required.", "members": [ "tieredLayerCreateOrUpdateDto" ] }, { "message": "'0x0A' is invalid within a JSON string. The string should be correctly escaped. Path: $[0] | LineNumber: 8 | BytePositionInLine: 5.", "members": [ "$[0]" ] }
-
0
Hi,
I can't reproduce the problem
public abstract class TmAppService : ApplicationService { protected TmAppService() { LocalizationResource = typeof(TmResource); } } public class TestAppService : TmAppService, ITestAppService { public Task<TieredLayerCreateOrUpdateDto> TestAsync(TieredLayerCreateOrUpdateDto input) { return Task.FromResult(input); } }
public class TieredLayerCreateOrUpdateDto : FullAuditedEntityDto<int>, IHasConcurrencyStamp { //public int? Id { get; set; } [Required] public string TieredLevelName { get; set; } = null!; public decimal LowerLimit { get; set; } public decimal? UpperLimit { get; set; } public decimal Rate { get; set; } public int? BillingItemId { get; set; } public string? ConcurrencyStamp { get; set; } = null!; } public interface ITestAppService: IApplicationService { Task<TieredLayerCreateOrUpdateDto> TestAsync(TieredLayerCreateOrUpdateDto input); }
-
0
Hello, please find below the exact error we are getting in the browser console, in addition to the code
{"error":{"code":null,"message":"طلبك غير صحيح!","details":"تم الكشف عن الأخطاء التالية أثناء التحقق .\r\n - The value 'layer-to-billing-item' is not valid.\r\n","data":{},"validationErrors":[{"message":"The value 'layer-to-billing-item' is not valid.","members":["id"]}]}}
private async Task CreateLayerToBillingItemAsync(List<TieredLayerCreateOrUpdateDto> tieredLayerCreateOrUpdateDtos) {
try { if (await NewTieredLayerValidations.ValidateAll() == false) { return; } await TieredLayersAppService.CreateLayerToBillingItemAsync(tieredLayerCreateOrUpdateDtos); await CloseCreateTieredLayerModalAsync(); } catch (Exception ex) { await HandleErrorAsync(ex); }
}
public virtual async Task<List<TieredLayerDto>> CreateLayerToBillingItemAsync(List<TieredLayerCreateOrUpdateDto> tieredLayerCreateOrUpdateDtos) {
if (tieredLayerCreateOrUpdateDtos != null && tieredLayerCreateOrUpdateDtos.Count > 0) { var tieredLayerDtosList = new List<TieredLayerDto>(); foreach (var tieredLayerCreateOrUpdateDto in tieredLayerCreateOrUpdateDtos) { if (tieredLayerCreateOrUpdateDto.Id == 0) { var tieredLayer = ObjectMapper.Map<TieredLayerCreateOrUpdateDto, TieredLayer>(tieredLayerCreateOrUpdateDto); try { var tieredLayerReturn = await _tieredLayerManager.CreateAsync( tieredLayerCreateOrUpdateDto.BillingItemId, tieredLayerCreateOrUpdateDto.TieredLevelName, tieredLayerCreateOrUpdateDto.LowerLimit, tieredLayerCreateOrUpdateDto.Rate, tieredLayerCreateOrUpdateDto.UpperLimit ); var tieredLayerDto = ObjectMapper.Map<TieredLayer, TieredLayerDto>(tieredLayerReturn); tieredLayerDtosList.Add(tieredLayerDto); } catch (Exception ex) { return new List<TieredLayerDto>(); } } else { var tieredLayer = ObjectMapper.Map<TieredLayerCreateOrUpdateDto, TieredLayer>(tieredLayerCreateOrUpdateDto); var tieredLayerUpdated = await _tieredLayerManager.UpdateAsync(tieredLayer.Id, tieredLayer.BillingItemId, tieredLayer.TieredLevelName, tieredLayer.LowerLimit, tieredLayer.Rate, tieredLayer.UpperLimit); //var tieredLayerUpdated = await _tieredLayerRepository.UpdateAsync(tieredLayer); var tieredLayerDto = ObjectMapper.Map<TieredLayer, TieredLayerDto>(tieredLayerUpdated); tieredLayerDtosList.Add(tieredLayerDto); } } return tieredLayerDtosList; } return new List<TieredLayerDto>();
-
0
Hi,
Can you share a minimal reproducible project with me? I will check it. shiwei.liang@volosoft.com
-
0
sent GitHub Link by email
-
0
ok, please make the repo private.
-
0
done
-
0
Hello liangshiwei,
I noticed that we changed the proxy setting to Static, it worked normally so I think it is an issue within the dynamic proxies, can you check this and advise the solution?
also, we have a question regarding the ABP auto controller API, does it implement the service interface automatically in the controller or we should implement it ourselves?
Thanks, Mina.
-
0
Because the parameter name is not the same, you should make sure they are the same
we have a question regarding the ABP auto controller API, does it implement the service interface automatically in the controller or we should implement it ourselves?
You can check the document: https://docs.abp.io/en/abp/latest/API/Auto-API-Controllers
-
0
the Dynamics Proxy is solved but for the Static proxy, we are getting the below error, is that normal?
Value cannot be null. (Parameter 'source') System.ArgumentNullException: Value cannot be null. (Parameter 'source') at Volo.Abp.Check.NotNull[T](T value, String parameterName) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Core\Volo\Abp\Check.cs:line 18 at System.Collections.Generic.AbpCollectionExtensions.AddIfNotContains[T](ICollection
1 source, T item) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Core\System\Collections\Generic\AbpCollectionExtensions.cs:line 30 at Volo.Abp.Cli.ServiceProxying.CSharp.CSharpServiceProxyGenerator.AddGenericTypeUsingNamespace(String typeFullName, List
1 usingNamespaceList) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\ServiceProxying\CSharp\CSharpServiceProxyGenerator.cs:line 577 at Volo.Abp.Cli.ServiceProxying.CSharp.CSharpServiceProxyGenerator.AddGenericTypeUsingNamespace(String typeFullName, List1 usingNamespaceList) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\ServiceProxying\CSharp\CSharpServiceProxyGenerator.cs:line 585 at Volo.Abp.Cli.ServiceProxying.CSharp.CSharpServiceProxyGenerator.GetRealTypeName(String typeName, List
1 usingNamespaceList) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\ServiceProxying\CSharp\CSharpServiceProxyGenerator.cs:line 542 at Volo.Abp.Cli.ServiceProxying.CSharp.CSharpServiceProxyGenerator.GenerateAsyncClassMethod(ActionApiDescriptionModel action, String returnTypeName, StringBuilder methodBuilder, List1 usingNamespaceList) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\ServiceProxying\CSharp\CSharpServiceProxyGenerator.cs:line 334 at Volo.Abp.Cli.ServiceProxying.CSharp.CSharpServiceProxyGenerator.GenerateClassMethod(ActionApiDescriptionModel action, StringBuilder clientProxyBuilder, List
1 usingNamespaceList) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\ServiceProxying\CSharp\CSharpServiceProxyGenerator.cs:line 274 at Volo.Abp.Cli.ServiceProxying.CSharp.CSharpServiceProxyGenerator.GenerateClassFileAsync(GenerateProxyArgs args, ControllerApiDescriptionModel controllerApiDescription) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\ServiceProxying\CSharp\CSharpServiceProxyGenerator.cs:line 219 at Volo.Abp.Cli.ServiceProxying.CSharp.CSharpServiceProxyGenerator.GenerateProxyAsync(GenerateProxyArgs args) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\ServiceProxying\CSharp\CSharpServiceProxyGenerator.cs:line 146 at Volo.Abp.Cli.Commands.ProxyCommandBase`1.ExecuteAsync(CommandLineArgs commandLineArgs) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\Commands\ProxyCommandBase.cs:line 57 at Volo.Abp.Cli.CliService.RunInternalAsync(CommandLineArgs commandLineArgs) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\CliService.cs:line 169 at Volo.Abp.Cli.CliService.RunAsync(String[] args) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Cli.Core\Volo\Abp\Cli\CliService.cs:line 77D:\Business data2\Project\UtilityBillingSystemBW\src\UtilityBillingSystemBW.HttpApi.Client>
-
0
Hi,
This is a bug with CLI, we will fix it: https://github.com/abpframework/abp/pull/18061