Мой контроллер должен получить определенный объект от вызывающего, когда используется api, но в моем случае он получает объект типа, который я запросил, но с приложением, установленным в null . У параметра есть метка [FromBody], но я также попробовал [FromForm] и полностью устранил этикет, но результат почти тот же с той разницей, что когда я использую [FromBody], мое приложение бросает исключение Null, когда я пытаюсь получить доступ к определенному поле от объекта, а в других случаях приличия просто устанавливаются в значения по умолчанию (если это int равно 0, а для строки - «»). Если это помогает ... Я вызываю api из созданной страницы.Приложение asp.net mvc6 получает нулевой параметр из web api
Вот мой объект:
using AT.Core.Cqrs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace DotnetProject.BusinessLayer.Implementation.Queries
{
public class GetTestByIdQuery : IQuery
{
public int TestId { get; set; }
}
}
Конец HTTP точка от контроллера:
[HttpGet]
[Route("getTest")]
public int GetTest([FromServices]GetTestByIdQueryHandler handler,[FromBody]GetTestByIdQuery query)
{
return query.TestId;
}
И мое ConfigureServices функции от запуска:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddScoped<IUserService, UserService>();
services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<ITestRepository, TestRepository>();
services.AddScoped<ITestService, TestService>();
services.AddScoped<IRoleService, RoleService>();
services.AddScoped<IRoleRepository, RoleRepository>();
services.AddScoped<ICommandHandler<DeleteUserCommand>, DeleteUserHandler>();
services.AddScoped<ICommandHandler<UpdateUserCommand>,UpdateUserHandler>();
services.AddScoped<ICommandHandler<AddUserCommand>, AddUserHandler>();
services.AddScoped<ICommandHandler<DeleteTestCommand>, DeleteTestHandler>();
services.AddScoped<ICommandHandler<UpdateTestCommand>, UpdateTestHandler>();
services.AddScoped<ICommandHandler<AddTestCommand>, AddTestHandler>();
services.AddScoped<IQueryHandler<GetAllTestsQuery,GetAllTestsQueryResult>,GetAllTestsQueryHandler>();
services.AddScoped<IQueryHandler<GetTestByIdQuery, GetTestByIdQueryResult>,GetTestByIdQueryHandler>();
services.AddScoped<IQueryHandler<GetAllUsersQuery, GetAllUsersQueryResult>, GetAllUsersQueryHandler>();
services.AddScoped<IQueryHandler<GetUserByIdQuery, GetUserByIdQueryResult>, GetUserByIdQueryHandler>();
services.AddScoped<GetAllTestsQueryHandler, GetAllTestsQueryHandler >();
services.AddScoped<GetTestByIdQueryHandler, GetTestByIdQueryHandler>();
services.AddScoped<GetAllUsersQueryHandler, GetAllUsersQueryHandler>();
services.AddScoped <GetUserByIdQueryHandler, GetUserByIdQueryHandler>();
services.AddScoped <AddTestHandler, AddTestHandler>();
services.AddScoped <AddUserHandler, AddUserHandler>();
services.AddScoped <DeleteTestHandler, DeleteTestHandler>();
services.AddScoped <DeleteUserHandler, DeleteUserHandler>();
services.AddScoped <UpdateTestHandler, UpdateTestHandler>();
services.AddScoped <UpdateUserHandler, UpdateUserHandler>();
services.AddDbContext<ApplicationContext>();
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
config.OutputFormatters.Clear();
config.OutputFormatters.Add(new JsonOutputFormatter(new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
}, ArrayPool<char>.Shared));
});
services
.AddMvc()
.AddJsonOptions(jsonOptions =>
{
jsonOptions.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
});
// Inject an implementation of ISwaggerProvider with defaulted settings applied
services.AddSwaggerGen();
}
EDIT: Заголовки + тело когда я использую этикетки [FromBody].
Curl
curl -X GET --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{ \
"testId": 60 \
}' 'http://localhost:5000/api/Test/getTest'
Request URL
http://localhost:5000/api/Test/getTest
Response Body
no content
Response Code
0
Response Headers
{
"error": "no response from server"
Headers + тело, когда я не ставлю никакого этикета:
Curl
curl -X GET --header 'Accept: application/json' 'http://localhost:5000/api/Test/getTest'
Request URL
http://localhost:5000/api/Test/getTest
Response Body
0
Response Code
200
Response Headers
{
"date": "Tue, 17 Jan 2017 22:49:14 GMT",
"transfer-encoding": "chunked",
"content-type": "application/json; charset=utf-8",
"server": "Kestrel",
"": ""
}
Если бы вы могли включить пример входящего в ваш контроллер http, который бы помог. Пожалуйста, включите все заголовки, тело и какой метод http вы используете. –
Я добавил http-вызов –