Perl与c#通信的一种方法ASP将响应返回给Perl
本文关键字:Perl ASP 方法 响应 返回 一种 通信 | 更新日期: 2023-09-27 18:01:58
我有一个。net应用程序,其中有一个ASP网页,使用c#进行服务器端处理和动态控制网页。问题关注的部分是提交的表单。然后将提交的表单交给Perl脚本进行处理。但是,在某些情况下,会出现需要用户查看并确认或取消进程的冲突。因此,Perl脚本需要与c#类进行对话,通过网页向用户提供验证数据和确认的提示,然后c#将确认信息发送给Perl脚本以继续执行。
到目前为止,项目可以调用Perl脚本,完成后,它返回一个显示给用户的响应。我希望能够通过运行Perl脚本定期与网页上的用户进行通信。这可能吗?
我已经研究了Win32::API,但我不确定这是否是正确的路线。
下面是我目前如何从c#调用Perl脚本:
ProcessStartInfo perlStartInfo = new ProcessStartInfo(@"C:'Perl64'bin'perl.exe");
perlStartInfo = new ProcessStartInfo(@"C:'usr'bin'perl.exe");
perlStartInfo.Arguments = "'"" + webAppPath + "ccrmiddleman.pl'" -action submit -date " + Date1.Text;
perlStartInfo.UseShellExecute = false;
perlStartInfo.RedirectStandardOutput = true;
perlStartInfo.RedirectStandardError = true;
perlStartInfo.CreateNoWindow = false;
Process perl = new Process();
perl.StartInfo = perlStartInfo;
perl.Start();
StdOut.Text = perl.StandardOutput.ReadToEnd();
StdErr.Text = perl.StandardError.ReadToEnd();
perl.WaitForExit(60);enter code here
当web表单被提交并且在这个Perl脚本被执行之后,它然后将响应异步发送回网页以启动一个灯箱窗口。
<form id="form1" runat="server"><!--div-->
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:Label ID="LabelDate1" runat="server" Text="Date"></asp:Label>
<asp:Button ID="SubmitBtn" runat="server" Text="Submit" OnClick="SubmitBtn_Click" />
<asp:Button ID="ClearBtn" runat="server" Text="Clear" UseSubmitBehavior="false" CausesValidation="false" OnClientClick="return CleanForm();" />
<asp:RegularExpressionValidator ID="Date1Validator" runat="server" ControlToValidate="Date1" ValidationExpression="'d'd/'d'd/'d'd" ErrorMessage="Please enter valid date."></asp:RegularExpressionValidator>
<asp:CalendarExtender ID="CalendarExtender1" CssClass="input" runat="server" TargetControlID="Date1" TodaysDateFormat="MMMM d, yyyy" Format="MM/dd/yy" OnClientDateSelectionChanged="callserver"></asp:CalendarExtender>
<asp:FilteredTextBoxExtender ID="DateFilter" runat="server" TargetControlID="Date1" FilterType="Custom, Numbers" ValidChars="/" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div id="light" class="white_content"><asp:Label ID="lbText" runat="server" Text="Label"></asp:Label><br /><br /><a href = "javascript:void(0)" onclick = "document.getElementById('light').style.display='none';document.getElementById('fade').style.display='none'">Close</a></div>
<div id="fade" class="black_overlay"></div>
<DBWC:DynamicControlsPlaceholder ID="PlaceHolder" runat="server" ControlsWithoutIDs="DontPersist"></DBWC:DynamicControlsPlaceholder>
<asp:Literal ID="LiteralJS" runat="server" Visible="false"></asp:Literal>
<asp:Label ID="ccrTitle" runat="server"></asp:Label>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="CalendarUpdateBtn" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="SubmitBtn" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="ClearBtn" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
<!--/div-->
</form>
多谢谢!
考虑到Perl需要与c#进程"对话",我的建议是使用一种能够在Perl和c#之间很好地工作的消息传递协议。
Stomp - http://stomp.github.io/将是一种选择-在c#端使用ApacheNMS,在Perl端使用Net::Stomp,中间使用Stomp服务器。
ZeroMQ可能值得一看- http://www.zeromq.org/-它可能会简化事情,因为您不需要单独的代理进程。
AMQP - http://www.amqp.org/是第三个选项。
当然,另一种让Perl与c#对话的好方法是在c#代码中设置一个web服务,并让Perl使用Mojo::UserAgent https://metacpan.org/module/Mojo::UserAgent或类似的方法调用它