WebApi POST参数始终为空

3
我正在尝试设置一个WebAPI方法,以便我可以将用户添加到我的数据库中。 在前端,我使用Marionette Backbone,以及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; }
}

这两个枚举看起来像这样:

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

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

当我尝试添加(注册)用户时,提交的实体始终为null。 Posted entity is null 但是,正如您在截图中所看到的那样,当我使用以下方式查看已提交的值时:
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)

编辑3:我已将控制器类型更改为apicontroller而不是odatacontroller,现在它突然可以工作了。我想使用odatacontroller。


是的,apiUserEntitynull - Jurgen Welschen
对我来说运行良好,你能展示更多的代码吗?路由注册和是否有枚举类型? - Amit Kumar Ghosh
展示 ApiPermissionApiUserRole 的内容。 - Amit Kumar Ghosh
我已经修改了我的问题,包括我的路由配置和枚举。谢谢你的帮助。 - Jurgen Welschen
您是否在使用EntityFramework? 如果是,那么请验证Context类的属性名称。 - Amit Kumar Ghosh
显示剩余4条评论
1个回答

0

需要检查的几个事项:

  1. 日期字段是否被正确反序列化。
  2. 尝试将枚举类型赋值为 int 值,并将 JSON 值作为 int 而不是字符串传递。
  3. 你是否应该为 Id 传递 -1?如果由数据库填充,请将此字段保留为空。

可能更适合作为评论,因为它提供了要检查的项目,而不是解决问题的方案。 - SnareChops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接