2015-08-15 174 views
3

我正在尝试设置一个webapi方法,可以将用户添加到我的数据库中。 在前端我使用木偶骨架和breezejs一起保存到我的webapi。WebApi POST参数始终为空

我有我的后台给用户的实体如下所示:

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 
} 

当我尝试添加(注册)的用户但是发布的实体始终为空。 Posted entity is null 但你可以在截图中看到,当我看与公布值:

base.Request.Content.ReadAsStringAsync().Result 

我可以看到张贴的JSON值只能作为一个字符串。

{"Id":-1,"CreatedAt":"1899-12-31T23:00:00","Username":"test","Password":"test","Email":"[email protected]","Permission":"3","Role":"0"} 

看起来它与对象的反序列化有关。 我看了小提琴手,看它是否被设置正确的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":"[email protected]","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) 
     ); 
} 

EDIT2: 我已经查明的异常时的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

+0

你在'apiUserEntity'中得到了什么?它是'空'吗? –

+0

是'apiUserEntity'是'null' –

+0

我已经更新了截图,以便更清楚。 –

回答

0

几项检查:

  1. 日期字段是被正确地反序列化。
  2. 尝试分配您的Enums int值,并将JSON值作为int而不是字符串传递。
  3. 您是否应该为您的ID传递-1?如果该字段由数据库填充,则将该字段留空,让数据库填充该字段。
+0

可能作为评论更好,因为这提供了项目来检查,而不是解决问题。 – SnareChops