Параметр POST WebApi всегда нулевой

Я пытаюсь настроить метод webapi, с помощью которого я могу добавить пользователя в свою базу данных. На фронтенде я использую марионеточную магистраль вместе с breezejs для сохранения изменений в моем webapi.

У меня есть объект на моем сервере для пользователя, который выглядит следующим образом:

public class ApiUserEntity {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public DateTime CreatedAt { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public ApiPermission Permission { get; set; }
    public ApiUserRole Role { get; set; }
}

2 перечисления выглядят так:

public enum ApiUserRole {
    User,
    Staff,
    Admin,
    Master
}

public enum ApiPermission {
    Read,
    Write,
    ReadWrite,
    None
}

Когда я пытаюсь добавить (зарегистрировать) пользователя, однако сущность, которая публикуется, всегда равна нулю. Отправленный объект является нулевым Но, как вы можете видеть на скриншоте, когда я смотрю опубликованное значение с:

base.Request.Content.ReadAsStringAsync().Result

Я вижу опубликованное значение JSON только в виде строки.

{"Id":-1,"CreatedAt":"1899-12-31T23:00:00","Username":"test","Password":"test","Email":"test@test.nl","Permission":"3","Role":"0"}

Кажется, это как-то связано с десериализацией объекта. Я посмотрел в fiddler, чтобы увидеть, правильно ли он устанавливает Content-Type:

--batch_7273 - bef2 - 5778
Content - Type: multipart / mixed; boundary = changeset_9a18 - de60 - f7a4

--changeset_9a18 - de60 - f7a4
Content - Type: application / http
Content - Transfer - Encoding: binary

POST / odata / ApiUsers HTTP/ 1.1
Content - ID: 1
DataServiceVersion: 2.0
Accept: application / atomsvc + xml; q = 0.8, application / json; odata = fullmetadata; q = 0.7, application / json; q = 0.5, */*;q=0.1
Content-Type: application/json
MaxDataServiceVersion: 3.0

{"Id":-1,"CreatedAt":"1899-12-31T23:00:00","Username":"test","Password":"test","Email":"test@test.nl","Permission":"3","Role":"0"}
--changeset_9a18-de60-f7a4--

--batch_7273-bef2-5778--

И, как вы можете видеть, тип контента установлен на application/json для этого элемента пакета, но моя сущность остается пустой, и похоже, что webapi не может преобразовать json в мой объект apiuserentity.

РЕДАКТИРОВАТЬ мой маршрут регистрации выглядит следующим образом:

 public static void Register(HttpConfiguration config)
{
    var cors = new EnableCorsAttribute("*", "*", "*", "DataServiceVersion, MaxDataServiceVersion"); // origins, headers, methods
    config.EnableCors(cors);

    config.DependencyResolver = new UnityDependencyResolver(UnityHelpers.GetConfiguredContainer());

    // enable elmah
    config.Services.Add(typeof (IExceptionLogger), new ElmahExceptionLogger());

    // Web API routes
    config.MapHttpAttributeRoutes();

    ODataModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<ApiUserEntity>("ApiUsers");
    builder.EntitySet<DomainEntity>("Domains");
    builder.EntitySet<RouteEntity>("Routes");
    builder.EntitySet<ModuleEntity>("Modules");

    config.Routes.MapODataServiceRoute(
        routeName: "odata",
        routePrefix: "odata",
        model: builder.GetEdmModel(),
        batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer)
        );
}

РЕДАКТИРОВАТЬ 2: я проследил исключения, когда действие webapi было запущено и нашел это:

 iisexpress.exe Information: 0 : Request, Method = POST, Url = http://localhost:22594/odata/ApiUsers, Message='http://localhost:22594/odata/ApiUsers'
iisexpress.exe Information: 0 : Message = 'ApiUsers', Operation = DefaultHttpControllerSelector.SelectController
iisexpress.exe Information: 0 : Message = 'WebAPI.Controllers.ApiUsersController', Operation = DefaultHttpControllerActivator.Create
iisexpress.exe Information: 0 : Message = 'WebAPI.Controllers.ApiUsersController', Operation = HttpControllerDescriptor.CreateController
iisexpress.exe Information: 0 : Message = 'Selected action 'Post(ApiUserEntity apiUserEntity)'', Operation = ApiControllerActionSelector.SelectAction
iisexpress.exe Information: 0 : Message = 'Selected action 'Post(ApiUserEntity apiUserEntity)'', Operation = ODataActionSelector.SelectAction
iisexpress.exe Information: 0 : Message = 'Will use new 'ODataMediaTypeFormatter' formatter', Operation = ODataMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe Information: 0 : Message = 'Will use new 'ODataMediaTypeFormatter' formatter', Operation = ODataMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe Information: 0 : Message = 'Will use new 'ODataMediaTypeFormatter' formatter', Operation = ODataMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe Information: 0 : Message = 'Will use new 'ODataMediaTypeFormatter' formatter', Operation = ODataMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe Information: 0 : Message = 'Will use new 'ODataMediaTypeFormatter' formatter', Operation = ODataMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe Information: 0 : Message = 'Will use new 'ODataMediaTypeFormatter' formatter', Operation = ODataMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe Information: 0 : Message = 'Will use new 'ODataMediaTypeFormatter' formatter', Operation = ODataMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe Information: 0 : Message = 'Will use same 'FormUrlEncodedMediaTypeFormatter' formatter', Operation = FormUrlEncodedMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe Information: 0 : Message = 'Will use same 'JQueryMvcFormUrlEncodedFormatter' formatter', Operation = JQueryMvcFormUrlEncodedFormatter.GetPerRequestFormatterInstance
iisexpress.exe Error: 0 : Operation = ODataMediaTypeFormatter.ReadFromStreamAsync, Exception = System.NotImplementedException: the method or operation is not implemented

at System.Web.HttpContextBase.get_Response()
at System.Web.UI.Util.GetUrlWithApplicationPath(HttpContextBase context, String url)
at System.Web.Routing.RouteCollection.NormalizeVirtualPath(RequestContext requestContext, String virtualPath)
at System.Web.Routing.RouteCollection.GetVirtualPath(RequestContext requestContext, String name, RouteValueDictionary values)
at System.Web.Http.WebHost.Routing.HostedHttpRouteCollection.GetVirtualPath(HttpRequestMessage request, String name, IDictionary`2 values)
at System.Web.Http.Routing.UrlHelper.GetVirtualPath(HttpRequestMessage request, String routeName, IDictionary`2 routeValues)
at System.Web.Http.Routing.UrlHelper.Route(String routeName, IDictionary`2 routeValues)
at System.Web.Http.Routing.UrlHelper.Link(String routeName, IDictionary`2 routeValues)
at System.Web.Http.OData.Extensions.UrlHelperExtensions.CreateODataLink(UrlHelper urlHelper, String routeName, IODataPathHandler pathHandler, IList`1 segments)
at System.Web.Http.OData.Extensions.UrlHelperExtensions.CreateODataLink(UrlHelper urlHelper, IList`1 segments)
at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.GetBaseAddress(HttpRequestMessage request)
at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)

EDIT3: я изменил свой тип контроллера на apicontroller вместо odatacontroller, и теперь он вдруг работает. Я хотел бы использовать odatacontroller

1 ответ

Несколько вещей, чтобы проверить:

  1. Поле даты десериализовано должным образом.
  2. Попробуйте назначить значения Enums int и передать значение JSON как int вместо строки.
  3. Если вы передаете -1 для вашего идентификатора? Оставьте это поле пустым, если оно заполнено БД, пусть оно будет заполнено БД.
Другие вопросы по тегам