从webservice调用批处理文件以写入文本文件

时间:2012-06-14 10:27:22

标签: web-services mercurial mercurial-hook

这看起来有点疯狂,但如果你能告诉我一个更好的方法,请做。 我需要一个webservice来显示当前版本的mercurial修订号。

我有一个非常简单的批处理文件,可以将此编号写入文本文件

cd C:\inetpub\wwwroot\MyWebsite
hg identify --num > services\version.txt 

以及应该调用批处理文件的方法然后读取文件的内容,现在,写入屏幕(我在网页中进行,但将迁移到稍后简单的服务)

Private Sub GetVersionNumber()
    Dim versionFile = Server.MapPath("~/services/version.txt")
    Dim batchFile = Server.MapPath("~/services/version.bat")
    Process.Start(batchFile)

    Dim revision As String = String.Empty
    Using reader As New StreamReader(versionFile)
        Do While reader.Peek() <> -1
            revision = reader.ReadLine()
        Loop
    End Using
    Response.Write(revision)
End Sub

我已经授予Everyone写入服务目录的权限并明确地在version.txt上,但是当我点击页面时,version.txt文件始终为空。如果我在notepad ++中打开文件,那么我会收到一条消息,说该文件已被其他程序修改过,我是否要重新加载它。当我这样做时,它是空的。如果我在文件中设置了一些文本并保存它,那么再次访问网页我的文本文件的内容就会被删除。

我在try / catch块中有这个但是没有抛出任何异常,所以我删除了它(为了清楚起见)。

最终我需要的是获得结果 hg识别--num
在网页/服务上显示为字符串,该字符串将由单独的SharePoint网站调用

3 个答案:

答案 0 :(得分:0)

批处理文件为空的原因是,只要父线程处于活动状态,启动并以这种方式运行的进程才能生效。此外,使用Process.Start不会等待该过程完成。作为specified in the documentation,此方法的返回是一个布尔值,表示进程已启动或未启动。由于您将其视为空白,因此只要流程启动,您的程序就会一直运行并完成(因为它是一个Web服务)。

一旦您的Web服务退出子服务,该线程就会终止,并且所有子进程都会随之终止。具体来说,当你的流读取器读取空文件时,当前运行批处理文件的cmd.exe在它真正开始之前就会被终止。

如果您可以保证批处理文件处理速度相当快,您可能会尝试使用Thread.Sleep来使Web服务调用暂停足够长时间以使该批处理文件完成处理,但这始终是将成为一个竞争条件。

答案 1 :(得分:0)

我会直接调用Mercurial并从其标准输出流中读取:

var hg = new ProcessStartInfo("C:\Program Files\Mercurial\hg.exe", "identify --num -R c:\inetpub\webroot");
hg.RedirectStandardOutput = True;
hg.RedirectStandardInput = True;
hg.UseShellExecute = False;
hg.CreateNoWindow = True;

var hgProc = New Process()
hgProc.StartInfo = hg
hgProc.Start()

var repoID = hgProc.StandardOutput.ReadToEnd()

答案 2 :(得分:0)

您不必在每次请求页面时从Web服务器手动调用批处理文件,而是可以配置Mercurial更新挂钩,以便在每次工作副本更新时自动调用您的identify命令。

例如,将其添加到存储库的.hg\hgrc文件中:

[hooks]
update.writeversion = hg identify --num > services\version.txt

有关挂钩的其他信息的链接: