网站多级栏目,怎么快速做网站文章,什么是网络营销的第二层次,网站 的特效前言前2次#xff0c;我们都是假设客户需要返回不同的字符串格式。但是#xff0c;有可能客户要求的返回是非本文格式#xff0c;比如文件流。怎么办#xff1f;思路前提#xff0c;当然还是使用同一API接口#xff0c;不影响现有使用方式。虽然ASP.NET Core Web API默认… 前言前2次我们都是假设客户需要返回不同的字符串格式。但是有可能客户要求的返回是非本文格式比如文件流。怎么办思路前提当然还是使用同一API接口不影响现有使用方式。虽然ASP.NET Core Web API默认使用SystemTextJsonOutputFormatter格式化响应但是OutputFormatters集合里其实包含了StreamOutputFormatter。那么实现目标就转化为怎么让Web API使用StreamOutputFormatterDefaultOutputFormatterSelector通过查看dotnet/aspnetcore源代码我们找到了DefaultOutputFormatterSelector它是选择IOutputFormatter以写入对当前请求的响应的默认实现其中选择IOutputFormatter具体实现是通过判断CanWriteResult方法代码如下foreach (var formatter in formatters)
{formatterContext.ContentType new StringSegment();formatterContext.ContentTypeIsServerDefined false;if (formatter.CanWriteResult(formatterContext)){return formatter;}
}而StreamOutputFormatter是这样实现CanWriteResult方法的public bool CanWriteResult(OutputFormatterCanWriteContext context)
{if (context null){throw new ArgumentNullException(nameof(context));}// Ignore the passed in content type, if the object is a Stream.if (context.Object is Stream){return true;}return false;
}那么实现目标就转化为怎么让Web API返回的是Stream操作返回类型微软官方文档ASP.NET Core Web API 中控制器操作的返回类型[1]提到返回类型除了支持特定类型之外还支持ActionResultT。ActionResultT可以返回从ActionResult派生的类型或返回特定类型那么实现目标就转化为将返回类型设为ActionResultT根据条件返回T或者返回特定ActionResult派生类例如FileResult。实现具体实现代码如下如果Accept Header是text/json则返回文件流[HttpGet]
public ActionResultIEnumerableWeatherForecast Get()
{var rng new Random();var result Enumerable.Range(1, 5).Select(index new WeatherForecast{Date DateTime.Now.AddDays(index),TemperatureC rng.Next(-20, 55),Summary Summaries[rng.Next(Summaries.Length)]}).ToArray();HttpContext.Request.Headers.TryGetValue(Accept, out var acceptValue);if (acceptValue.ToString() text/json){using (var memory new MemoryStream()){using (var writer new StreamWriter(memory)){writer.Write(System.Text.Json.JsonSerializer.Serialize(result));writer.Flush();}return File(memory.ToArray(), text/json, WeatherForecast.json);} }return result;
}结论现在只需要客户在每个API请求加上Accept Header即可满足需求。如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“参考资料[1]ASP.NET Core Web API 中控制器操作的返回类型: https://docs.microsoft.com/zh-cn/aspnet/core/web-api/action-return-types?viewaspnetcore-5.0