Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#web服务中执行批处理文件_C#_Web Services_Batch File_Batch Processing - Fatal编程技术网

在C#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

我试图在C#web服务中执行一个批处理文件。我确信批处理文件没有问题。我面临的问题是批处理文件将仅在调试模式下执行。当我与客户机连接时,它不会产生错误,也不会被执行。我确信连接没有问题,因为我可以成功地从客户端向web服务发送一些东西

代码如下:

        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时会返回什么