【发布时间】:2016-08-20 08:13:53
【问题描述】:
设置
- 我有一个 WebAPI 控制器,它使用 HttpClient.PostAsJsonAsync 调用 Web 端点
- 假设控制器方法的响应和对 Web 端点的请求是相同的实体类型
- 我已经为此实体类型注册了一个自定义 JsonConverter。我有一个用例来访问此转换器中的 HttpContext
问题:当调用转换器的WriteJson方法,在HttpClient.PostAsJsonAsync期间序列化实体时,HttpContext.Current为NULL。
但是,当在 WebAPI 响应中序列化实体时调用相同的流时,上下文是可用的。
以前有没有人遇到过类似的问题?我不确定这个问题的原因是什么以及可能的解决方案/解决方法。
我可以使用示例 WebAPI 项目重现此行为。以下是相关的代码片段:
[JsonConverter(typeof(EntityConverter))]
public interface IEntity
{
}
public class Entity : IEntity
{
}
public class EntityConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// httContext is NULL when deserializing the HttpClient request entity
var httpContext = HttpContext.Current;
var principal = httpContext?.User;
Console.WriteLine("");
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return new Entity();
}
public override bool CanConvert(Type objectType)
{
return typeof(Entity) == objectType;
}
}
public class ValuesController : ApiController
{
// POST api/values
public async Task<HttpResponseMessage> Post([FromBody]string value)
{
HttpClient client = new HttpClient();
var message = await client.PostAsJsonAsync("http://example.com", new Entity());
Console.WriteLine(message);
return Request.CreateResponse(HttpStatusCode.Created, new Entity());
}
}
【问题讨论】:
-
你可以尝试使用完整的命名空间 - System.Web.HttpContext.Current
标签: c# asp.net-web-api json.net