Mag*_*son 120 asp.net asp.net-web-api
我需要从ASP.NET Web API控制器以纯文本形式获得响应.
我试过做一个请求,Accept: text/plain但它似乎没有做的伎俩.此外,请求是外部的,不受我的控制.我要做的是模仿旧的ASP.NET方式:
context.Response.ContentType = "text/plain";
context.Response.Write("some text);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑,解决方案:根据Aliostad的回答,我添加了WebAPIContrib文本格式化程序,在Application_Start中初始化它:
config.Formatters.Add(new PlainTextFormatter());
Run Code Online (Sandbox Code Playgroud)
我的控制器最终结果如下:
[HttpGet, HttpPost]
public HttpResponseMessage GetPlainText()
{
return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, "Test data", "text/plain");
}
Run Code Online (Sandbox Code Playgroud)
Ric*_*ahl 225
嗯......我认为您不需要创建自定义格式化程序来使其工作.而是返回这样的内容:
[HttpGet]
public HttpResponseMessage HelloWorld()
{
string result = "Hello world! Time is: " + DateTime.Now;
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Content = new StringContent(result, System.Text.Encoding.UTF8, "text/plain");
return resp;
}
Run Code Online (Sandbox Code Playgroud)
这适用于我而不使用自定义格式化程序.
如果您明确要创建输出并覆盖基于Accept标头的默认内容协商,则您不希望使用Request.CreateResponse()它,因为它会强制使用mime类型.
而是显式创建一个新的HttpResponseMessage并手动分配内容.上面的示例使用StringContent但是有很多其他内容类可用于从各种.NET数据类型/结构返回数据.
Des*_*tar 14
如果您只是在寻找一个简单的普通/文本格式化程序而不添加其他依赖项,那么这应该可以解决问题.
public class TextPlainFormatter : MediaTypeFormatter
{
public TextPlainFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
}
public override bool CanWriteType(Type type)
{
return type == typeof(string);
}
public override bool CanReadType(Type type)
{
return type == typeof(string);
}
public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext)
{
return Task.Factory.StartNew(() => {
StreamWriter writer = new StreamWriter(stream);
writer.Write(value);
writer.Flush();
});
}
public override Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, IFormatterLogger formatterLogger)
{
return Task.Factory.StartNew(() => {
StreamReader reader = new StreamReader(stream);
return (object)reader.ReadToEnd();
});
}
}
Run Code Online (Sandbox Code Playgroud)
不要忘记将其添加到您的Global web api配置中.
config.Formatters.Add(new TextPlainFormatter());
Run Code Online (Sandbox Code Playgroud)
现在您可以将字符串对象传递给
this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain");
Run Code Online (Sandbox Code Playgroud)
Ali*_*tad 12
HttpContext.Current责任.httpResponseMessage.Headers可以通过text/plain在控制器中将内容类型标题设置为to 来强制它.对于.net核心:
[HttpGet("About")]
public ContentResult About()
{
return Content("About text");
}
Run Code Online (Sandbox Code Playgroud)
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/formatting
当Accept:text/plain不起作用时,则没有用于文本mime类型的已注册格式化程序.
通过从服务配置获取所有支持的格式化程序列表,可以确保没有指定mime类型的格式化程序.
创建一个非常简单的媒体类型格式化程序,支持文本mime类型.
http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
| 归档时间: |
|
| 查看次数: |
65815 次 |
| 最近记录: |