繁体   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