2015-08-15 175 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