Xero webhook 不工作说 "Response contained a body"

Xero webhook not working says "Response contained a body"

我正在尝试使用本地工作的 Xero 进行 webhook 设置。我正在使用 ngrok 来允许 xero 调用我的本地主机。为了使 webhook 正常工作,我必须正确 return“接收意图”

它似乎工作正常,因为我可以调试它并跟进它。但是,当我尝试 return 200 成功(哈希匹配)或 401 未授权(哈希不匹配)时,接收 Xero 仍然不接受它。它只是说:“响应包含 body”

根据 Xero webhook docs 我的端点必须确保:

  1. 它使用 HTTPS
  2. 它会在 5 秒内响应 200 O.K 状态码
  3. 响应中没有body
  4. 响应中没有 cookies headers
  5. 如果签名无效,则 401 未授权状态代码为 returned

我已经尝试 return 以各种方式编写代码:

public IHttpActionResult WebHooks()
{
    //if hash check fails I tried these
    return Unauthorized();
    return Request.CreateResponse((int)HttpStatusCode.Unauthorized);
    return StatusCode(HttpStatusCode.Unauthorized);
    
    //if hash check matched I tried the following
    return Ok();
    return Request.CreateResponse((int)HttpStatusCode.OK);
    return StatusCode(HttpStatusCode.OK);
    
}

万般无奈中我也试过了

public int WebHooks()
{
    //if hash check matches
    return 200;
    //if hash check fails
    return 401;
}

提前感谢您的帮助。我花了太长时间寻找现有答案,但找不到任何答案。我究竟做错了什么?据我所知,我的 webapi 应该可以工作。

想通了。这就是我为让它工作所做的工作:

            if (hashedPayload != xeroSignature)
            {
                ControllerContext.HttpContext.Response.Clear();
                ControllerContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                ControllerContext.HttpContext.Response.End();
                return Content(string.Empty);
            }

            ControllerContext.HttpContext.Response.Clear();
            ControllerContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.OK;
            return Content(string.Empty);

我试过的都没有用,我的发誓罐溢出来了。我通过 ngrok 注意到“接收意图”将 return 302(而不是 401)然后重定向到 Account/Login.

这让我陷入了困境,我发现了 the answer

引用:

If you are adding asp.net WebApi inside asp.net MVC web site you probably want to respond unauthorized to some requests. But then ASP.NET infrastructure come into play and when you try to set response status code to HttpStatusCode.Unauthorized you will get 302 redirect to login page.

这正是我看到的行为。当我仅使用一种方法在新的 webapi 项目中尝试 webhook 时,它起作用了。但是我想让它在我的 MVC 站点中工作。我添加了这个 post 建议的内容,它现在对我来说非常有用。

非常感谢@Jacob Alley