2017-01-17 5 views
-1

Мой контроллер должен получить определенный объект от вызывающего, когда используется 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", 
    "": "" 
} 
+0

Если бы вы могли включить пример входящего в ваш контроллер http, который бы помог. Пожалуйста, включите все заголовки, тело и какой метод http вы используете. –

+0

Я добавил http-вызов –

ответ

0

Я держу пари, что смешивая [FromBody] и [FromServices] на методе действий является то, что не удается. [FromServices] - это конструкция, позволяющая инвертировать элемент управления для ввода экземпляров службы в ваш контроллер. Строго говоря, из фона МОК, введение значения в метод действия - плохая идея в целом, поэтому я удивлен, увидев, что эта функциональность даже существует.

Чтобы заставить его работать, переместите свой аргумент [FromServices] в конструктор вашего контроллера, а затем внутри вашего действия вы можете связаться с этой службой за нужное значение.

public class MySimpleController 
{ 
    private GetTestByIdQueryHandler _handler; 
    public MySimpleController([FromServices] GetTestByIdQueryHandler handler) 
    { 
     _handler = handler 
    } 

    [HttpGet] 
    [Route("getTest")] 
    public int GetTest([FromBody]GetTestByIdQuery query) 
    { 
     return _handler.SomeMethod(query.TestId); 
    } 
} 
Смежные вопросы