1

我有一个带有 ASP 网页的 .NET 应用程序,该网页使用 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>

非常感谢!

4

1 回答 1

0

鉴于 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调用它或类似的。

于 2013-07-18T02:10:36.553 回答