需要从System.Threadding.Tasks.Task中提取值,就像当我调用其返回Task作为返回值的方法时一样。
我正在使用Task来查找内部的任何属性以获取值,但是我找不到任何属性来获取值。
目标方法如下。
public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
{
object response = null;
ResponseCollection<Model> data = (ResponseCollection<Model>)context.Object;
if (data != null && data.Records != null)
{
List<Response> Response = Mapper.Map<List<Model>, List<Response>>(data.Records);
response = Response;
}
DefaultContractResolver contractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy()
};
return context.HttpContext.Response
.WriteAsync(JsonConvert.SerializeObject(response,
new JsonSerializerSettings
{
ContractResolver = contractResolver,
Formatting = Formatting.Indented
}), selectedEncoding);
}
我试图以以下方式调用该方法,但得到的只是任务,但我需要从任务中获取响应。
[TestMethod]
public void SuccessTest()
{
MyFormatter formatter = new MyFormatter();
var httpContext = new DefaultHttpContext();
httpContext.Request.Headers.Add("customheader1", "9");
httpContext.Request.Headers.Add("customheader2", "10");
Func<Stream, Encoding, TextWriter> func = NewMethod;
OutputFormatterWriteContext context = new OutputFormatterWriteContext(httpContext, func, null, GetModel());
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Model, Response>();
});
formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode).Wait();
string responseBody = new StreamReader(context.HttpContext.Response.Body).ReadToEnd();
Assert.AreEqual(1, 1);
}
private TextWriter NewMethod(Stream arg1, Encoding arg2)
{
return new StreamWriter(arg1, arg2);
}
现在,如何从任务类型的结果中找到响应?
这是要注意的,但是要构建一个custum媒体格式化程序并对其进行单元测试。我建立了格式化程序,但是当进行单元测试时,我需要像我需要断言的响应对象。 我无法返回任务,因为您可以看到WriteAsync方法的返回类型为Task,我必须将其返回。
答案 0 :(得分:2)
您必须使用await
async
个方法。 Task
是结果的包装,可以有选择地解析为一个值,并保留线程的上下文以捕获异常。
await formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode);
但是,在您的代码中,您仅返回了Task
。没有实际的返回值,因此您不应期望从函数中得到任何回报,除非它本身完成了。如果需要从async
函数返回特定值,则应将类型包装在Task
中,即Task<T>
。
答案 1 :(得分:0)
您正在对http上下文执行异步写入操作。等待写操作后,您可以在下一条语句中访问响应
await formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode);
由于您不是在异步方法中执行此操作,因此可以使用Wait()
方法来同步等待。
formatter.WriteResponseBodyAsync(context, Encoding.BigEndianUnicode).Wait();
http共振是在写入时被推送到客户端的流。为了读取响应,您必须打开流读取器并读取正文。并且您必须在写入操作完成后执行此操作。
// Read the response body
string responseBody = new StreamReader(context.HttpContext.Response.Body).ReadToEnd();