У меня есть контроллер, который выглядит так
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, я не уверен, как поступить.