我正在尝试设置一个WebAPI方法,以便我可以将用户添加到我的数据库中。
在前端,我使用Marionette Backbone,以及BreezeJS将更改保存到我的WebAPI。
我在后端有一个用户实体,其外观如下:
当我尝试添加(注册)用户时,提交的实体始终为null。 但是,正如您在截图中所看到的那样,当我使用以下方式查看已提交的值时:
我只能看到作为字符串发布的JSON值。
我在后端有一个用户实体,其外观如下:
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。 但是,正如您在截图中所看到的那样,当我使用以下方式查看已提交的值时:
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。
apiUserEntity
是null
。 - Jurgen WelschenApiPermission
和ApiUserRole
的内容。 - Amit Kumar GhoshEntityFramework
? 如果是,那么请验证Context
类的属性名称。 - Amit Kumar Ghosh