我正在创建一个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中的
。这个人。Net核心3,我必须像ConfigureServices
方法中。cs服务一样设置它。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]
可能不是一种好方法。
该链接示例不适用于。净核心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相关的每个数据库,我可以依赖?