gpt4 book ai didi

c# - 写入 HttpResponse 时 header 是只读异常

转载 作者:行者123 更新时间:2023-12-05 05:13:55 25 4
gpt4 key购买 nike

我有一个看起来像这样的 Controller

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()

我知道一旦数据写入响应就无法设置 header ,但在我这边,我在向 HttpResponse 写入任何内容之前设置 header 。

从我所做的调试来看, header 的异常仅在 Controller 返回 HttpResponse 后抛出。这向我表明,更改 header 的尝试是在我的代码之外的某些地方完成的。

我使用的是 Visual Studio 设置的大部分样板代码。这是默认程序

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();

它正在调用大多数默认的 Startup

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseMvc();
}

我认为解决方案要么在于更改配置中的某些内容,使其在我返回 HttpResponse 后不自动设置响应 header ,要么可能返回一个不同的对象,这样我就不必手动设置 header 。在我写入 HttpResponse 后无法知道试图设置 header 的来源,我不确定如何继续。

最佳答案

为什么不在写响应之前写标题?甚至更好:为什么不将返回声明为更抽象的东西并让框架处理这些而不是手动设置响应?

无论如何,这里有一段关于如何添加自定义 header 的代码:

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;
}
}
}

关于c# - 写入 HttpResponse 时 header 是只读异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53085572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com