如何在 ASP.Net MVC 应用程序中使用 Webhook 从 JIRA 检索信息?

How to retrieve information from JIRA using webhooks in an ASP.Net MVC application?

我正在使用一个 MVC 应用程序,它将向 JIRA 发送一封电子邮件,其中包含在 JIRA 中创建 Issue 所需的信息。

这一切都成功了,但下一步是检索页面中的信息。目前我正在显示通过从数据库检索发送的信息。

问题是我还需要检索问题的KEYstatus。这不能直接输入,因为用户不知道它们是什么,必须在 JIRA 中完成。

最初我打算使用 API 从 JIRA 获取信息,但由于 JIRA 站点不是在线托管的 API 不符合 Access-Control-Allow-Headers" Header.

我被告知我必须使用 webhooks 来获取信息,但我不确定如何去做。

我知道我必须首先注册我正在做的 webhook 通过 JIRA 管理 UI。 我想知道的是我如何才能检索到它在我使用 webhook 的应用程序中的信息,我知道 webhook 必须为创建的 webhook 一个友好的名称 URL 应发送回调

webhook 的范围事件 到 post 到 URL,或者 "all events" 或一组特定的事件。

我还知道 Post 函数网络挂钩如果添加到创建问题工作流程转换中将不会触发。我们建议您将网络挂钩配置为从 issue_created 事件触发。

那么我怎样才能成功检索到这些信息,我目前正在尝试这样做:

  Public Function Webhook() As ActionResult
        Dim status As String = "Status"
        If Request("secret") <> status Then
            Response.StatusCode = 403
            Return Content("Invalid status secret")
        End If
        If Request("event") = "incoming_messages" Then
            Dim Key As String = Request("Key")
            Dim jiraStatus As String = Request("status")

            Dim reply As Dictionary(Of String, Object) = New Dictionary(Of String, Object)()
            reply("content") = "Thanks for your submission!"

            Dim result As Dictionary(Of String, Object) = New Dictionary(Of String, Object)()
            result("messages") = New Object() {reply}

            Return Json(result)

        Else
            Response.StatusCode = 400
            Return Content("Unknown event")
        End If

        Return View()
    End Function

但我很确定我做错了,我需要遵循哪些步骤才能正确执行此操作?

更新

我的 Webhook URL 应该在哪里触发,目前我正在将它发送到 RequestB.in 进行测试,但我应该在哪里触发它以获取我的 MVC 应用程序中的信息?它应该触发 MVC 应用程序,如果是,它应该触发到哪里。

我如何处理当前在我的 MVC 应用程序中的 Json 有效载荷,我正在尝试反序列化它,但我以前没有这样做过,并且不确定如何将 Json 有效载荷与应用。这是我到目前为止尝试过的:

        Request.InputStream.Position = 0
        Request.InputStream.Seek(0, SeekOrigin.Begin)
        Using reader = New StreamReader(Request.InputStream)

            Dim jiraJson = reader.ReadToEnd()
            Dim contentType As String = Request.ContentType
            Dim body = JsonConvert.DeserializeObject(jiraJson)

            Try
                Select Case DirectCast(body.key, String)
                    Case ""
                        Return Json(jiraJson)

                    Case Else
                        Return Json(jiraJson)


                End Select
            Catch ex As Exception

            End Try
        End Using

        Return View()

我不确定在 switch 语句中放置什么以及如何 return json 然后显示它,我该怎么做?

如果我对你的理解正确,那么它应该如何工作的高级过程将是:

  • 已向 Jira 发送一封电子邮件。
  • 在给定的项目下创建了一个问题,它触发了 webhook。
  • webhook 将 POST 一个 JSON 负载到您指定的 URL。
  • URL 应该是 MVC 应用程序中的一个 public 路由,它使用并处理请求。

因此,考虑到您已经到达的位置,使用 webhook 所需要做的就是 public 可访问的 MVC 路由。假设您有一个名为 "JiraUpdateController" 的控制器,并且在该控制器上存在一个名为 "ProcessWebhook" 的方法:

public class JiraUpdateController : Controller
{
    /// <summary>
    /// Set our default base logger for the update tasks
    /// </summary>
    private static readonly Logger logger = LogManager.GetCurrentClassLogger();

    public static Logger Log
    {
        get { return logger; }
    }

    [HttpPost]
    public ActionResult ProcessWebhook()
    {
         // Process the JSON payload here accordingly.
    }    
}

现在,您需要将其设置为 Webhook 应该 post 的 URL。最终它应该看起来像:

http://internal.company.com/JiraUpdate/ProcessWebhook

我做过与此非常相似的事情,所以这里有几点要记住。

  • 确保将 webhook 设置为最小范围。如果这是您希望在所有项目中创建问题时在所有项目中触发的内容,那么您将有相当多的请求转到 ProcessWebhook 端点。尝试将项目限制为您需要的项目,并将活动限制为仅 "issue created" 活动。

  • 如果您还没有 public 端点进行测试,您一定要查看 RequestBin。这将允许您做的是为 webhook 设置一个临时的 URL,这样您就可以准确地看到来自 JIRA 的 JSON 有效负载是什么样子的。从那里开始,在 ProcessWebhook 方法中构建您的业务逻辑,您应该可以开始了。要使用 RequestBin,只需转到该站点,生成一个 URL,并将其设置为 Webhook URL。在您正在使用的项目下的 JIRA 中创建一个问题,您应该会看到一个很大的 JSON 有效载荷转到那个 RequestBin URL - 这会让您确切地感受到 JSON 看起来像以及如何将其序列化为一个可行的结构。