我正在尝试设置一个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
}
当我尝试添加(注册)的用户但是发布的实体始终为空。 但你可以在截图中看到,当我看与公布值:
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
你在'apiUserEntity'中得到了什么?它是'空'吗? –
是'apiUserEntity'是'null' –
我已经更新了截图,以便更清楚。 –