簡體   English   中英

在 graphql controller 響應上設置狀態碼

[英]setting status code on graphql controller response

伙計們,我很抱歉發布這個問題

我對 C#(具有 javascript 背景)很陌生,我一直在嘗試設置 AsP.Net graphql 服務器,我管理它,但服務器的控制台總是

 System.InvalidOperationException: StatusCode cannot be set because the response has already started.

我的 controller 代碼是:


namespace server.Controllers
{

    [Route("graphql")]
    [ApiController]
    public class GraphqlController : ControllerBase
    {
        [HttpPost]
        public async Task<ActionResult> Post([FromBody] GraphQLQuery query)
        {
            var writer = new GraphQL.SystemTextJson.DocumentWriter();

            var schema = new MySchema();
            var inputs = query.Variables.ToInputs();
            var executer = new DocumentExecuter();
            var result = await executer.ExecuteAsync(_ =>
            {
                _.Schema = schema.GraphQLSchema;
                _.Query = query.Query;
                _.OperationName = query.OperationName;
                _.Inputs = inputs;
            });

            Response.ContentType = "application/json";
            Response.StatusCode = 200; // OK
            await writer.WriteAsync(Response.Body, result);
            if (result.Errors?.Count > 0)
            {
                return BadRequest();
            }
            else
            {
                return Ok(result);
            }
  
        }
    }
}

你能幫我解決我做錯了什么嗎?

原因是您在使用時已經開始響應

        Response.ContentType = "application/json";
        Response.StatusCode = 200; // OK
        await writer.WriteAsync(Response.Body, result);

您正在手動處理響應 stream 以及應該寫入的內容。

此操作與 ASP.Net 在使用Ok()時所做的相同。 ASP.Net 將結果寫入響應正文並將狀態代碼設置為 200。

由於您自己處理響應,因此您不應該真正使用 ASP.Net 的功能。 您可以只返回如下所示的EmptyResult ,並且您應該得到相同的響應結果,而不會出現來自中間件的錯誤。

return new EmptyResult();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM