1

C# を使用してサーバー側の処理と動的に制御される Web ページを実行する ASP Web ページを含む .NET アプリケーションがあります。質問が焦点を当てている部分は、提出されているフォームです。送信されたフォームは、Perl スクリプトに渡されて処理されます。ただし、ユーザーがプロセスを表示して確認またはキャンセルする必要がある競合が発生する場合があります。そのため、Perl スクリプトは C# クラスと対話して、Web ページを介してユーザーにプロンプ​​トを表示し、データを検証して確認する必要があります。これにより、C# は確認を Perl スクリプトに送信して続行します。

現時点では、プロジェクトは Perl スクリプトを呼び出すことができ、完了するとユーザーに表示される応答を返します。Perl スクリプトを実行して、Web ページ上でユーザーに定期的に通信できるようにしたいと考えています。これは可能ですか?

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 スクリプトが実行された後、応答が Web ページに非同期で返され、ライトボックス ウィンドウが起動されます。

<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/は 1 つのオプションです。C# 側で ApacheNMS を使用し、Perl 側で Net::Stomp を使用し、中間に Stomp サーバーを使用します。

ZeroMQ は一見の価値があるかもしれません - http://www.zeromq.org/ - 別のブローカー プロセスを必要としないという点で物事を簡素化するかもしれません。

AMQP - http://www.amqp.org/は 3 番目のオプションです。

そしてもちろん、Perl に C# と対話させるもう 1 つの良い方法は、C# コードで Web サービスをセットアップし、Mojo::UserAgent を使用して Perl にそれを呼び出させることです https://metacpan.org/module/Mojo::UserAgentまたは類似。

于 2013-07-18T02:10:36.553 に答える