ASP.NET - 远程截图

时间:2010-05-19 09:57:27

标签: asp.net screenshot

我制作了一个非常简单的小应用程序来截取桌面并发送到网络共享。大约10台PC将安装此应用程序。

我的想法是,ASP.NET中将有一个仪表板,它只是在网页上显示这些屏幕截图。到目前为止,简单的东西。 但是,因为我不想每隔1分钟阻塞网络并发送屏幕截图,我想根据ASP.NET用户的要求在远程PC上启动.exe。

不幸的是我没有找到任何信息(我是一个完整的ASP.NET n00b),如何在远程PC的上下文中启动远程可执行文件(所以我不会看到ASP服务器的截图:)) 如果没有这种可能性,请告知其他解决方法。

5 个答案:

答案 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)

谢谢大家回答,这些都是有趣的方法。

然而,由于许多因素,我最终得到了以下解决方案:

  1. 客户端PC上的伪服务(带有托盘图标和隐藏表单的Windows窗体)应用程序。它作为TCP服务器。

  2. 服务器上的ASP.Net Web应用程序,具有TCP客户端功能。

  3. 根据网络用户的要求,网络应用程序正在向所选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()

%>