我制作了一个非常简单的小应用程序来截取桌面并发送到网络共享。大约10台PC将安装此应用程序。
我的想法是,ASP.NET中将有一个仪表板,它只是在网页上显示这些屏幕截图。到目前为止,简单的东西。 但是,因为我不想每隔1分钟阻塞网络并发送屏幕截图,我想根据ASP.NET用户的要求在远程PC上启动.exe。
不幸的是我没有找到任何信息(我是一个完整的ASP.NET n00b),如何在远程PC的上下文中启动远程可执行文件(所以我不会看到ASP服务器的截图:)) 如果没有这种可能性,请告知其他解决方法。
答案 0 :(得分:2)
澄清后更新:
从另一个角度看一下情况:
为什么不在托管触发捕获的asp.net页面的客户端上运行Web服务器。然后,您可以从根服务器向客户端发送http请求并获取图像。
您可以尝试http://CassiniDev.codeplex.com - 它支持外部IP和主机名。
你也可以考虑简单地嵌入CassiniDev-lib(这里显示一个非常简单的例子 - Using CassiniDev to host ASP.Net in your application,这样你可以使用web服务器作为接收者,表单app可以做任何你想做的事情客户。
我对此方法充满信心,因为我将cassinidev设计为主要用例之一。
从asp.net你不能。一旦进入浏览器,它就只有HTML / JavaScript。
ActiveX是一种可能性,但它非常痛苦,过时且有限。而且痛苦。
执行此类操作的新方法是通过Click Once部署.net Forms应用程序或WPF应用程序。
您也可以编写WPF浏览器应用程序,但获得所需的权限需要将网站设置为完全信任。
答案 1 :(得分:1)
如果网页可以在您的计算机上启动任意.exe文件,那将是一场安全灾难。
但是,由于这些是您的PC,您可以要求他们安装某种类型的ActiveX控件,然后将其嵌入到ASP.NET页面中。
答案 2 :(得分:0)
正如其他人所说,ASP.Net确实没有办法调用应用程序,但是逆转控制流应该可以正常工作......
我想你可以让抓取器应用程序一直在用户桌面上运行,但让它调用服务器提供的web服务/文件,其中包含该应用程序实例的指令以获取截图
像...一样的东西。
App:我必须做什么吗? (GET /workinstruction.aspx)
服务器:没有。 (服务器决定是否请求工作,并将结果返回(workinstruction.aspx)
App :(等待1分钟)
App:我必须做什么吗? 服务器:是的。
App :(截图和提交)
App :(等待1分钟)
App:我必须做什么吗?
等...
答案 3 :(得分:0)
谢谢大家回答,这些都是有趣的方法。
然而,由于许多因素,我最终得到了以下解决方案:
客户端PC上的伪服务(带有托盘图标和隐藏表单的Windows窗体)应用程序。它作为TCP服务器。
服务器上的ASP.Net Web应用程序,具有TCP客户端功能。
根据网络用户的要求,网络应用程序正在向所选PC发送预先格式化的“激活”字符串。托盘应用程序正在制作屏幕截图并将其发送到预定义的SMB共享,可供Web应用程序显示。
再次感谢!
答案 4 :(得分:0)
我已经完成了几次这样的事情来监控远程显示系统。我发现使用MiniCap.exe捕获图像也拍摄了视频(远程显示系统需要)。 我还使用了Sky Sanders描述的Cassini和一个带有以下代码的ASPX页面。
然后我只是从img src =“http://computer/page.aspx?paramters”中引用该页面。 (如果您需要更多信息,请告诉我)
<%@ Import NameSpace="System.IO" %>
<%@ Import NameSpace="System.Drawing" %>
<%@ Import NameSpace="System.Drawing.Imaging" %>
<%@ Import NameSpace="System.Diagnostics" %>
<%
Response.Buffer = True
Response.BufferOutput = True
Dim CompressionLevel As Integer = 1
Dim compress As Integer = 1
If Not Request.Item("compress") Is Nothing Then
If IsNumeric(Request.Item("compress")) = True Then
CompressionLevel = CInt(Request.Item("compress"))
End If
End If
compress = CompressionLevel
' Resize requested?
Dim SizeX As Integer = 100
Dim SizeY As Integer = 75
If Not Request.Item("width") Is Nothing Then
If IsNumeric(Request.Item("width")) = True Then
SizeX = CInt(Request.Item("width"))
CompressionLevel = 10
End If
End If
If Not Request.Item("height") Is Nothing Then
If IsNumeric(Request.Item("height")) = True Then
SizeY = CInt(Request.Item("height"))
CompressionLevel = 10
End If
End If
Dim Region As String = ""
If Not Request.Item("region") Is Nothing Then
Region = Request.Item("region")
End If
Dim XS As Integer = 0
Dim YS As Integer = 0
Dim XE As Integer = 1023
Dim YE As Integer = 766
Try
If Region.IndexOf(",") > -1 Then
Dim Rec() As String = Region.Split(",")
If Rec.GetUpperBound(0) >= 3 Then
If IsNumeric(Rec(0)) Then XS = Rec(0)
If IsNumeric(Rec(1)) Then YS = Rec(1)
If IsNumeric(Rec(2)) Then XE = Rec(2)
If IsNumeric(Rec(3)) Then YE = Rec(3)
End If
End If
Catch : End Try
Dim FileType As String = "jpg"
Dim MimeType As String = "jpeg"
If Not Request.Item("filetype") Is Nothing Then
FileType = Request.Item("filetype")
MimeType = FileType
End If
If Not Request.Item("mimetype") Is Nothing Then
FileType = Request.Item("mimetype")
End If
Dim ImageFile As String = ""
Dim ImageThumbFile As String = ""
Dim ImageFolder As String = Server.MapPath("~/ScreenShots/")
If IO.Directory.Exists(ImageFolder) = False Then
IO.Directory.CreateDirectory(ImageFolder)
End If
' Delete files older than 30 minutes
For Each File As String In IO.Directory.GetFiles(ImageFolder)
Response.Write("File: " & File & "<br>")
If IO.File.GetCreationTimeUtc(File).AddMinutes(30) < Now.ToUniversalTime Then
IO.File.Delete(File)
End If
Next
' Find available filename
Dim tmpC As Integer = 0
While tmpC < 100
tmpC += 1
ImageFile = "ScreenShot_" & CStr(tmpC).PadLeft(5, "0") & "." & FileType
ImageThumbFile = "ScreenShot_" & CStr(tmpC).PadLeft(5, "0") & "_thumb." & FileType
If IO.File.Exists(ImageFolder & "\" & ImageFile) = False Then
' Found our filename
' Reserve it
Dim ios As IO.FileStream = IO.File.Create(ImageFolder & "\" & ImageFile)
ios.Close()
ios = Nothing
Exit While
End If
End While
' Run MiniCap
' " -capturedesktop" & _
Dim CMD As String = """" & Server.MapPath("/MiniCap.EXE") & """" & _
" -save """ & ImageFolder & "\" & ImageFile & """" & _
" -captureregion " & XS & " " & YS & " " & XE & " " & YE & _
" -exit" & _
" -compress " & CompressionLevel
If Not CMD Is Nothing Then
Dim myProcess As Process = New Process
Dim RouteFB As String
With myProcess
With .StartInfo
.FileName = "cmd.exe"
.UseShellExecute = False
.CreateNoWindow = True
.RedirectStandardInput = True
.RedirectStandardOutput = True
.RedirectStandardError = True
End With
.Start()
End With
Dim sIn As IO.StreamWriter = myProcess.StandardInput
sIn.AutoFlush = True
' Create stream reader/writer references
Dim sOut As IO.StreamReader = myProcess.StandardOutput
Dim sErr As IO.StreamReader = myProcess.StandardError
' Send commands
sIn.Write(CMD & System.Environment.NewLine)
sIn.Write("exit" & System.Environment.NewLine)
' Wait one second
'Threading.Thread.CurrentThread.Sleep(60000)
' Read all data
Response.Write(sOut.ReadToEnd)
' Kill process if still running
If Not myProcess.HasExited Then
myProcess.Kill()
End If
sIn.Close()
sOut.Close()
sErr.Close()
myProcess.Close()
End If
Response.Clear()
Response.ClearContent()
If Not Request.Item("width") Is Nothing Or Not Request.Item("length") Is Nothing Then
' Resize, making thumbnail in desired size
Dim b As Bitmap = Bitmap.FromFile(ImageFolder & "\" & ImageFile)
Dim thumb As Bitmap = b.GetThumbnailImage(SizeX, SizeY, Nothing, IntPtr.Zero)
' Jpeg image codec
Dim jpegCodec As ImageCodecInfo
' Get image codecs for all image formats
Dim codecs As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders()
' Find the correct image codec
For i As Integer = 0 To codecs.Length - 1
If (codecs(i).MimeType = "image/" & MimeType) Then
jpegCodec = codecs(i)
Exit For
End If
Next i
Dim qualityParam As New EncoderParameter(System.Drawing.Imaging.Encoder.Quality, compress * 10)
Dim encoderParams As New EncoderParameters(1)
encoderParams.Param(0) = qualityParam
thumb.Save(ImageFolder & "\" & ImageThumbFile, jpegCodec, encoderParams)
thumb.Dispose()
b.Dispose()
' Send thumb
Response.TransmitFile(ImageFolder & "\" & ImageThumbFile)
Else
' Send normal file
Response.TransmitFile(ImageFolder & "\" & ImageFile)
End If
Response.End()
%>