在C#web服务中执行批处理文件
我试图在C#web服务中执行一个批处理文件。我确信批处理文件没有问题。我面临的问题是批处理文件将仅在调试模式下执行。当我与客户机连接时,它不会产生错误,也不会被执行。我确信连接没有问题,因为我可以成功地从客户端向web服务发送一些东西 代码如下:在C#web服务中执行批处理文件,c#,web-services,batch-file,batch-processing,C#,Web Services,Batch File,Batch Processing,我试图在C#web服务中执行一个批处理文件。我确信批处理文件没有问题。我面临的问题是批处理文件将仅在调试模式下执行。当我与客户机连接时,它不会产生错误,也不会被执行。我确信连接没有问题,因为我可以成功地从客户端向web服务发送一些东西 代码如下: try { System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartIn
try
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "C:\\mybatch.bat";
proc.StartInfo.UseShellExecute = true;
proc.Start();
}
catch (Exception e)
{
return e.ToString();
}
Visual Studio在管理员模式下运行,但cmd.exe在(myUser)模式下运行,但我已授予每个用户完全访问权限。我不知道这是否是个问题。如果没有,我应该在代码中添加一些内容吗(
请告诉我问题的可能原因和解决方法。web服务未在“普通桌面”中运行…它具有不同的(=更少)权限/权限,例如,它们通常无法访问共享…您可以使用您的用户帐户运行web服务(安全风险很大!)或者应该重新考虑您的设计,因为从web服务运行批处理文件通常不是web服务所做的事情 如果你真的需要这么做,试试看
ProcessStartInfo processInfo = new ProcessStartInfo(@"C:\mybatch.bat");
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
Process process = Process.Start(processInfo);
process.WaitForExit();
if(process.ExitCode==0){ // success}
请参见web服务未在“普通桌面”中运行…它具有不同的(=更少)权限/权限,例如,它们通常无权访问共享…您可以使用您的用户帐户运行web服务(安全风险很大!)或者应该重新考虑您的设计,因为从web服务运行批处理文件通常不是web服务所做的事情 如果你真的需要这么做,试试看
ProcessStartInfo processInfo = new ProcessStartInfo(@"C:\mybatch.bat");
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
Process process = Process.Start(processInfo);
process.WaitForExit();
if(process.ExitCode==0){ // success}
参见
< P>这是非常令人沮丧的事情在调试模式下工作,但在发布失败!为了考虑运行时的差异,我会考虑使用来自SysStudioS的免费PROMON工具: 下载并运行ProcMon以捕获所有注册表和文件访问。运行该程序后,在调试模式下点击网站,并通过web服务成功执行批处理文件。在ProdMon中,停止捕获(按CTRL-E开始并停止捕获),并按CTRL-F搜索“mybatch.bat” 您应该找到多行--注意关联的进程(可能是“w3wp.exe”),并注意每行的操作、路径和结果。您可以筛选结果--只需右键单击进程名称并选择“包含w3wp.exe” 当您准备好查看发布失败案例时,请清除跟踪(CTRL-X),将Web服务器置于发布模式,再次启动跟踪。现在点击您的Web服务…一旦失败,请停止跟踪(CTRL-C)然后查看失败的具体情况。一旦知道了这一点,您将能够专注于解决该问题,即调试和发布之间的具体区别。答案可能会出现在Yahia指出的文档中:祝你好运,并告诉你使用你发现的东西!
这是非常令人沮丧的事情时,调试模式,但未能在释放!为了整理出运行时的差异,我会考虑使用免费PROMON工具从SysStudials:< /P> 下载并运行ProcMon以捕获所有注册表和文件访问。运行该程序后,在调试模式下点击网站,并通过web服务成功执行批处理文件。在ProdMon中,停止捕获(按CTRL-E开始并停止捕获),并按CTRL-F搜索“mybatch.bat” 您应该找到多行--注意关联的进程(可能是“w3wp.exe”),并注意每行的操作、路径和结果。您可以筛选结果--只需右键单击进程名称并选择“包含w3wp.exe” 当您准备好查看发布失败案例时,请清除跟踪(CTRL-X),将Web服务器置于发布模式,再次启动跟踪。现在点击您的Web服务…一旦失败,请停止跟踪(CTRL-C)然后查看失败的具体情况。一旦知道了这一点,您将能够专注于解决该问题,即调试和发布之间的具体区别。答案可能会出现在Yahia指出的文档中:祝你好运,告诉你使用你找到的!正如Yahia在上面指出的,你的问题与安全权限有关。当在VS中通过调试运行时,你的web服务的常规权限会被提升 您可以开发一个轻量级Windows服务,该服务将在web服务主机上运行(您可以将它们放在不同的机器上,只要它们可以访问某些共享资源-请参阅下一步)。现在,该Windows服务自然具有扩展权限,因此它可以随时运行任何进程
至于如何利用两个brother服务之间的通信,我认为您有几个选择。我脑海中立即浮现的第一个选择是使用位于共享位置的文件。当WS接收到请求时,它会将该请求写在该共享位置的文件中。Windows服务或者有一个轮询计时器,用于在在位置,或者它可以使用获取事件通知。正如上面Yahia指出的,您的问题与安全权限有关。当在VS中通过调试运行时,您的web服务的常规权限将被提升 您可以开发一个轻量级Windows服务,该服务将在web服务主机上运行(您可以将它们放在不同的机器上,只要它们可以访问某些共享资源-请参阅下一步)。现在,该Windows服务自然具有扩展权限,因此它可以随时运行任何进程
至于如何利用两个brother服务之间的通信,我认为您有几个选择。我脑海中立即浮现的第一个选择是使用位于共享位置的文件。当WS接收到请求时,它会将该请求写在该共享位置的文件中。Windows服务或者有一个轮询计时器,用于在在位置,或者它可以使用获取事件通知。您说它不会产生错误,也不会执行-那么当您尝试访问web se时会返回什么