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

如何在ASP.NETMVC应用程序中使用Webhook从JIRA检索信息?,asp.net,asp.net-mvc,vb.net,jira,webhooks,Asp.net,Asp.net Mvc,Vb.net,Jira,Webhooks,我正在使用一个MVC应用程序,它将向JIRA发送一封电子邮件,其中包含在JIRA中创建问题所需的信息 这是所有成功的工作,但下一步是检索页面中的信息。目前,我正在显示通过从数据库检索发送的信息 问题是我还需要检索问题的键和状态。这不能只是输入,因为用户不知道它们是什么,必须在JIRA中完成 最初,我打算使用API从JIRA获取信息,但由于JIRA站点未在线托管,API不符合访问控制允许标题“标题 有人告诉我,我必须使用webhooks来获取信息,但我不确定该怎么做 我知道我必须首先通过JIRA管

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

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

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

最初,我打算使用API从JIRA获取信息,但由于JIRA站点未在线托管,API不符合访问控制允许标题“标题

有人告诉我,我必须使用webhooks来获取信息,但我不确定该怎么做

我知道我必须首先通过JIRA管理UI注册我正在做的webhook。
我要知道的是如何使用webhook在我的应用程序中检索该信息,我知道webhook必须为创建的webhook有一个友好的名称,URL,其中callba应发送ck

webhook的范围,以及发布到URL的事件,可以是“所有事件”或一组特定事件

我还知道,如果添加到创建问题工作流转换中,Post函数web钩子将不会启动。建议您将web钩子配置为从创建的问题事件启动

因此,我如何才能成功检索此信息,我目前正在尝试:

  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

我不确定在switch语句中放置什么,也不确定如何返回json并显示它,我如何才能做到这一点?

如果我正确理解您的意思,那么这应该如何工作的高级过程是:

  • 向Jira发送了一封电子邮件
  • 在给定项目下创建了一个问题,这将触发webhook
  • webhook将向您指定的URL发布JSON负载
  • URL应该是使用和处理请求的MVC应用程序中的公共路由
因此,考虑到您目前所处的位置,您只需要使用webhook即可公开访问MVC路由。假设您有一个名为“JiraUpdateController”的控制器,该控制器上存在一个名为“ProcessWebhook”的方法:

公共类JiraUpdateController:控制器
{
/// 
///为更新任务设置默认的基本记录器
/// 
私有静态只读记录器Logger=LogManager.GetCurrentClassLogger();
公共静态记录器日志
{
获取{return logger;}
}
[HttpPost]
public ActionResult ProcessWebhook()
{
//在这里相应地处理JSON负载。
}    
}
现在,您需要将此设置为webhook应该发布到的URL。最终,它应该如下所示:

我做过类似的事情,所以这里有几件事要记住

  • 请确保将webhook设置为最小范围。如果这是您希望在任何项目中创建问题时在所有项目中触发的事件,则会有相当多的请求发送到ProcessWebhook端点。请尝试将项目限制为您需要的项目,并将事件仅限于“已创建的问题”“事件

  • 如果您还没有用于测试的公共端点,那么您肯定应该签出。这将允许您做的是为webhook设置一个临时URL,这样您就可以确切地看到来自JIRA的JSON负载是什么样子的。从这里开始,在ProcessWebhook方法中构建您的业务逻辑,您就可以开始了。要使用RequestBin,只需转到站点,生成一个URL,并将其设置为Webhook URL。在您正在处理的项目下,在JIRA中创建一个问题,您应该会看到一个大的JSON负载进入该RequestBin URL——这将让您了解JSON的确切外观以及如何将其序列化为一个可行的构造


好的-请确定,您指的是internal.company.com链接还是RequestBin链接?前者只是我编造的一个例子。好吧,酷,只是想确定一下。如果您有任何其他问题,请告诉我。我不确定如何在ProcessWebhook中处理JSON,我正在尝试反序列化JSON,以及在哪里触发webhook URL,以便应用程序可以检索信息。我现在不知道如何将这些连接到一起。最终,你希望webhook发布到你的“JiraUpdate/ProcessWebhook”端点,但要做到这一点,你需要将你的应用托管在请求可以到达的地方。例如,假设您的建筑中有一个名为“JirainIntegration”的web服务器。另外,假设您已在此服务器上安装了应用程序,并且它正在IIS中名为“JiraProcessor”的应用程序下运行。然后,您的webhook应该发布到您的端点,并严格地用于消费。要测试它,只需从RequestBin中获取JSON负载,创建一个具有相同负载的Fiddler请求,并将其本地发布到您机器上运行的应用程序中-这允许您测试序列化-我使用
JsonConvert.DeserializeObject(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()
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.
    }    
}