当前位置: 首页 > 知识库问答 >
问题:

DocuSign将Webhook连接到。净核心3

长孙硕
2023-03-14

我正在创建一个webhook。Net Core 3 Web API,用于DocuSign Connect调用并向我提供状态更新我的应用程序创建的信封中的签名文档。C#示例位于https://www.docusign.com/blog/dsdev-adding-webhooks-application这对我几乎达到目标很有帮助。示例中的代码是:

[HttpPost("api/[controller]/ConnectWebHook")]
public void ConnectWebHook(HttpRequestMessage request)
{
    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(request.Content.ReadAsStreamAsync().Result);

    var mgr = new XmlNamespaceManager(xmldoc.NameTable);
    mgr.AddNamespace("a", "http://www.docusign.net/API/3.0");

    XmlNode envelopeStatus = xmldoc.SelectSingleNode("//a:EnvelopeStatus", mgr);
    XmlNode envelopeId = envelopeStatus.SelectSingleNode("//a:EnvelopeID", mgr);
    XmlNode status = envelopeStatus.SelectSingleNode("./a:Status", mgr);

    var targetFileDirectory = @"\\my-network-share\";

    if (envelopeId != null)
    {
        System.IO.File.WriteAllText($"{targetFileDirectory}{envelopeId.InnerText}_{status.InnerText}_.xml", xmldoc.OuterXml);
    }

    if (status.InnerText == "Completed")
    {
        // Loop through the DocumentPDFs element, storing each document.

        XmlNode docs = xmldoc.SelectSingleNode("//a:DocumentPDFs", mgr);
        foreach (XmlNode doc in docs.ChildNodes)
        {
            string documentName = doc.ChildNodes[0].InnerText; // pdf.SelectSingleNode("//a:Name", mgr).InnerText;
            string documentId = doc.ChildNodes[2].InnerText; // pdf.SelectSingleNode("//a:DocumentID", mgr).InnerText;
            string byteStr = doc.ChildNodes[1].InnerText; // pdf.SelectSingleNode("//a:PDFBytes", mgr).InnerText;

            System.IO.File.WriteAllText($"{targetFileDirectory}{envelopeId.InnerText}_{documentId}_{documentName}", byteStr);
        }
    }
}

出于测试目的,我的网络应用编程接口允许所有来源并通过NGROK暴露给外部世界,我可以命中其他测试endpoint(GET和POST),但出于某种原因,当有值得通知的事件时,连接不会命中此网络钩子在我的信封上。

我可以在DocuSSignAdmin门户日志中看到Connect调用了我的webook,但远程服务器返回了一个错误:(415)不支持的媒体类型...这导致我将[FromBody]属性添加到我的方法签名中,就像这样,但是当Connect调用我的网络钩子时,我仍然会得到同样的错误。

[HttpPost("api/[controller]/ConnectWebHook")]
public void ConnectWebHook([FromBody] HttpRequestMessage request)
{
    // ... rest of the method was unchanged, removed for brevity
}

我以前从未使用过HttpRequestMessage,但它看起来很简单。我在DocuSign管理门户日志中注意到,Connect试图发送到webhook的数据只是XML。我可以尝试更改webhook的签名,以查找XmlDocument而不是HttpRequestMessage,但我不确定我会错过什么。

最近有人通过网络钩子集成了连接吗?你能让HttpquiestMessage为你工作吗?

于2019年10月18日添加:

DocuSign提到内容类型是XML。以下是内容的外观:

<DocuSignEnvelopeInformation 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://www.docusign.net/API/3.0">
  <EnvelopeStatus>...</EnvelopeStatus>
  <DocumentPDFs>...</DocumentPDFs>
</DocuSignEnvelopeInformation>

我已将AddXmlSerializerFormatters()添加到Startup中的ConfigureServices方法中。cs。这个人。Net核心3,我必须像服务一样设置它。AddControllers()。添加XMLSerializerFormatters()而不是服务。AddMVC()。AddXmlSerializerFormatters()perhttps://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0

有了这个改变,我现在尝试使用[FromForm]像这样,我的webhook被点击了,但是请求输入参数基本上是空的<代码>请求。Content=null:

[HttpPost("api/[controller]/ConnectWebHook")]
public void ConnectWebHook([FromForm] HttpRequestMessage request)
{
    // ... rest of the method was unchanged, removed for brevity
}

由于请求是从DocuSign Connect发送的,因此我无法控制头/格式/内容。据我所知,他们没有提交XML对象,也没有提交表单,因此[FromForm]可能不是一种好方法。

共有1个答案

岑彬炳
2023-03-14

该链接示例不适用于。净核心HttpRequestMessage不再是asp中的一等公民。net核心框架,并将作为正常模型处理。

只需直接从请求的正文中提取内容,其余内容应该能够保持与示例中相同。

[HttpPost("api/[controller]/ConnectWebHook")]
public IActionResult ConnectWebHook() {

    Stream stream = Request.Body;

    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load(stream);

    var mgr = new XmlNamespaceManager(xmldoc.NameTable);
    mgr.AddNamespace("a", "http://www.docusign.net/API/3.0");

    XmlNode envelopeStatus = xmldoc.SelectSingleNode("//a:EnvelopeStatus", mgr);
    XmlNode envelopeId = envelopeStatus.SelectSingleNode("//a:EnvelopeID", mgr);
    XmlNode status = envelopeStatus.SelectSingleNode("./a:Status", mgr);

    var targetFileDirectory = @"\\my-network-share\";

    if (envelopeId != null) {
        System.IO.File.WriteAllText($"{targetFileDirectory}{envelopeId.InnerText}_{status.InnerText}_.xml", xmldoc.OuterXml);
    }

    if (status.InnerText == "Completed") {
        // Loop through the DocumentPDFs element, storing each document.

        XmlNode docs = xmldoc.SelectSingleNode("//a:DocumentPDFs", mgr);
        foreach (XmlNode doc in docs.ChildNodes) {
            string documentName = doc.ChildNodes[0].InnerText; // pdf.SelectSingleNode("//a:Name", mgr).InnerText;
            string documentId = doc.ChildNodes[2].InnerText; // pdf.SelectSingleNode("//a:DocumentID", mgr).InnerText;
            string byteStr = doc.ChildNodes[1].InnerText; // pdf.SelectSingleNode("//a:PDFBytes", mgr).InnerText;

            System.IO.File.WriteAllText($"{targetFileDirectory}{envelopeId.InnerText}_{documentId}_{documentName}", byteStr);
        }
    }

    return Ok();
}
 类似资料:
  • 我正在实现确认电子邮件功能。我正在向用户发送一封帐户激活电子邮件,电子邮件中有激活链接。我正在尝试,当用户单击电子邮件中的链接时,它会将用户重定向到我的方法ConfirmEmail之一,该方法采用两个参数user,即加密的电子邮件和代码。当我单击调试器设置为该ConfirmEmail方法的链接时,它不会出现在那里。 确认电子邮件方式: 电子邮件中的链接如下所示: https://localhost

  • 核心接口类 如上图所示,Angel的核心接口类,在Train的过程中,按照调用的流程,大体为: MLRunner MLRunner根据Conf,从工厂类,创建AngelClient,按照标准的Train流程开始依次调用AngelClient的各接口 AngelClient 启动PSServer 在PSServer上进行初始化,加载空白的模型 训练完成后,将模型从多个PSServer,保存到HDFS

  • 我正在尝试使用我的沙盒模式通过PayPal运行付款。NET CORE 3项目。这个想法是让客户能够选择是使用他/她的PayPal账户还是信用卡付款。我正在使用PayPal-NET-SDKv2.0.0-rc2 我正在努力理解这是否是正确的运行顺序: 使用 这是正确的执行命令吗?

  • 主要内容:1. Configuration,2. SessionFactory,3. Session,4. Transaction ,5. Query在 Hibernate 中有 5 个常用的核心接口,它们分别是 Configuration 接口、SessionFactory 接口、Session 接口、Transaction 接口和 Query 接口。本节,我们就对这 5 个核心接口进行详细讲解。 1. Configuration 正如其名,Configuration 主要用于管理 Hiber

  • 我在AWS控制台上创建了一个MySQL RDS。然后我使用以下步骤在MySQL Workbench中成功连接到该RDS: 连接方式:标准(TCP/IP) 然后我尝试在我的Asp中连接它。net核心应用程序,它在openConnection()上给了我错误。使用了以下连接字符串: “Server=zargham.ccir1327bjhl.us-east-2.rds.amazonaws.com;Por

  • 我有一个多租户数据库。共享数据库有一个租户配置表,该表保存所有租户信息 每个租户数据库都有一个插入触发器,该触发器将新记录插入到将租户id附加到该记录的核心数据库中。 我需要知道插入来自哪个租户数据库,以便能够根据执行该过程的数据库设置租户id。 是否有一个唯一的ID相关的每个数据库,我可以依赖?