【发布时间】:2014-10-24 16:53:26
【问题描述】:
我正在开发基于 Web API 2 的服务,使用 Entity Framework 6 进行持久性和 ASP.NET Identity 进行身份验证。我为实体框架使用默认的IdentityUser 实现。
假设我有一个这样的实体:
public class Example
{
[Key]
public string Id { get; set; }
public string Foo { get; set; }
public string Bar { get; set; }
public virtual IdentityUser OwningUser { get; set; }
}
在我的 Web API 控制器中,HTTP GET 请求以这种方式返回记录:
public async Task<Example> Get( string id )
{
var example = await _exampleRepository.FindByIdAsync( id );
return example;
}
这很好用。但是,请求会返回如下 JSON:
{
id: "some id",
foo: "some foo",
bar: "some bar",
owningUser: {
claims: [],
logins: [],
roles: [
{
userId: "some user id",
roleId: "some role id"
}
],
securityStamp: "jadshgiuahsduigh",
passwordHash: "adsghasdjgiasdg",
email: "some@email.com",
emailConfirmed: false,
... snip ...
userName: "some user",
id: "some user id"
}
}
我不想返回所有用户数据!我想做的是以某种方式拦截正在生成的 JSON 和要包含的白名单属性,这样在这种情况下,从 API 返回的序列化 IdentityUser 对象将只包含以下内容:
owningUser: {
userName: "some user",
id: "some user id"
}
我怎样才能做到这一点?我不想全面截断IdentityUser 记录;这必须是我可以在控制器操作的基础上选择加入的东西。这是可以通过动作过滤器实现的吗?拦截需要在管道的哪个位置进行?理想情况下,我希望仅对从控制器操作返回的对象图中的 IdentityUser 实例进行自定义序列化,而不是直接操作完成的 JSON 响应。如果相关,我将 Web API 作为 OWIN 中间件运行。
【问题讨论】:
-
常用方法:返回 DTO 而不是实体。
标签: c# entity-framework asp.net-web-api asp.net-identity owin