c# - 写入 HttpResponse 时标头是只读异常
问题描述
我有一个看起来像这样的控制器
IHttpWrite httpWrite;
[HttpPost]
public async Task<HttpResponse> Post(Request req)
{
return await httpWrite.Write(req, Response);
}
那叫这个
public async Task<HttpResponse> Write(object data, HttpResponse httpResponse)
{
var json = JsonConvert.SerializeObject(data);
httpResponse.OnStarting(() =>
{
httpResponse.Clear();
httpResponse.ContentType = "application/json";
return Task.CompletedTask;
});
await httpResponse.WriteAsync(json);
return httpResponse;
}
但是调用它会得到这个异常
System.InvalidOperationException: Headers are read-only, response has already started.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.ThrowHeadersReadOnlyException()
我知道一旦将数据写入响应,您就无法设置标头,但是在我结束之前,我在 HttpResponse 中设置标头,然后再向其写入任何内容。
从我所做的调试来看,只有在控制器返回 HttpResponse 后才会引发标头异常。这向我表明,更改标头的尝试是在我的代码之外进行的。
我正在使用 Visual Studio 设置的大部分样板代码。这是默认程序
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
哪个正在调用大多数默认启动
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseMvc();
}
我相信解决方案要么在于更改配置中的某些内容,以便在我返回 HttpResponse 后不自动设置响应标头,要么可能会返回不同的对象,这样我就不必手动设置标头。在我写入 HttpResponse 后无法知道尝试设置标头的内容的来源,我不确定如何继续。
解决方案
你为什么不在写响应之前写你的标题?甚至更好:与其手动设置响应,为什么不将返回声明为更抽象的东西并让框架处理这些?
无论如何,这里有一段关于如何添加自定义标题的代码:
using System;
using System.Linq;
using System.Net;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication.Controllers
{
[Route("api")]
public class ValuesController : Controller
{
[HttpGet]
[Route("values/{top}")]
public IActionResult Get(int top)
{
// Generate dummy values
var list = Enumerable.Range(0, DateTime.Now.Second)
.Select(i => $"Value {i}")
.ToList();
list.Reverse();
var result = new ObjectResult(list.Take(top))
{
StatusCode = (int)HttpStatusCode.OK
};
Request.HttpContext.Response.Headers.Add("X-Total-Count", list.Count.ToString());
return result;
}
}
}
推荐阅读
- ruta - 在 Ruta 的 CONTAINS 语句中使用条件
- python - BST 方法,返回指定范围内的值列表 Python 实现
- mysql - 带有 3 个 from 的内连接
- css - 媒体查询进行更改时不显示伪元素
- python - Why won't tf.write_file write a file?
- python - 如何清除用户输入?
- android - Android 通知:通知和数据有效负载有什么不同
- android - 如何为抽屉菜单项创建带圆角的波纹?
- reactjs - Pass a ref to a component
- java - Passing a varable from a JFrame to another