w3wp.exe 100% cpu problem? RRS feed

  • Question

  • User-651944244 posted

    Hi All,

     I recently purchased an ASP application from Dynamsoft.com which is an ActiveX plug in to allow scanning documents to a web server.  The problem is that when I upload files through a scanner and subsequently it's script, w3wp.exe hits 100% cpu. 

    They have a CAB file which I obviously can't access (right?) and then this code to upload (below.)  I've tried a hotfix from MS with no luck.  The files are about 1mb - 10mb in size as they upload, but I can upload identical TIFF files from a form with zero problems.

    Does anyone have any suggestions on a solution to this? 


    <!-- #include file="clsUpload.asp" -->
    If (Request.TotalBytes > 1) Then
        Dim objUpload, lngLoop
        dim directory
        directory=server.MapPath(".") & "\ImageScanned\"

        Set objUpload = New clsUpload
        For lngLoop = 0 to objUpload.Files.Count - 1
            objUpload.Files.Item(lngLoop).Save directory
            filename = directory + objUpload.Files.Item(lngLoop).FileName
            ProcessedFile = objUpload.Files.Item(lngLoop).FileName
        Set objUpload = Nothing
    end if


    <SCRIPT LANGUAGE=vbscript RUNAT=Server>
    Class clsUpload
    '    This class will parse the binary contents of the       '
    '    request, and populate the Form and Files collections. '
        Private m_objFiles
        Private m_objForm
        Public Property Get Form()
            Set Form = m_objForm
        End Property
        Public Property Get Files()
            Set Files = m_objFiles
        End Property
        Private Sub Class_Initialize()
            Set m_objFiles = New clsCollection
            Set m_objForm = New clsCollection
        End Sub
        Private Sub ParseRequest()
            Dim lngTotalBytes, lngPosBeg, lngPosEnd, lngPosBoundary, lngPosTmp, lngPosFileName
            Dim strBRequest, strBBoundary, strBContent
            Dim strName, strFileName, strContentType, strValue, strTemp
            Dim objFile
            'Grab the entire contents of the Request as a Byte string
            lngTotalBytes = Request.TotalBytes
            strBRequest = Request.BinaryRead(lngTotalBytes)
            'Find the first Boundary
            lngPosBeg = 1
            lngPosEnd = InStrB(lngPosBeg, strBRequest, UStr2Bstr(Chr(13)))

            If lngPosEnd > 0 Then
                strBBoundary = MidB(strBRequest, lngPosBeg, lngPosEnd - lngPosBeg)

                lngPosBoundary = InStrB(1, strBRequest, strBBoundary)
            End If
            If strBBoundary = "" Then
            'The form must have been submitted *without* ENCTYPE="multipart/form-data"
            'But since we already called Request.BinaryRead, we can no longer access
            'the Request.Form collection, so we need to parse the request and populate
            'our own form collection.
                lngPosBeg = 1
                lngPosEnd = InStrB(lngPosBeg, strBRequest, UStr2BStr("&"))
                Do While lngPosBeg < LenB(strBRequest)
                    'Parse the element and add it to the collection
                    dim temp
                    temp =     MidB(strBRequest, lngPosBeg, lngPosEnd - lngPosBeg)

                    strTemp = BStr2UStr(MidB(strBRequest, lngPosBeg, lngPosEnd - lngPosBeg))

                    lngPosTmp = InStr(1, strTemp, "=")
                    strName = URLDecode(Left(strTemp, lngPosTmp - 1))
                    strValue = URLDecode(Right(strTemp, Len(strTemp) - lngPosTmp))
                    m_objForm.Add strName, strValue
                    'Find the next element
                    lngPosBeg = lngPosEnd + 1
                    lngPosEnd = InStrB(lngPosBeg, strBRequest, UStr2BStr("&"))
                    If lngPosEnd = 0 Then lngPosEnd = LenB(strBRequest) + 1
            'The form was submitted with ENCTYPE="multipart/form-data"
            'Loop through all the boundaries, and parse them into either the
            'Form or Files collections.
                Do Until (lngPosBoundary = InStrB(strBRequest, strBBoundary & UStr2Bstr("--")))
                    'Get the element name
                    lngPosTmp = InStrB(lngPosBoundary, strBRequest, UStr2BStr("Content-Disposition"))       
                    lngPosTmp = InStrB(lngPosTmp, strBRequest, UStr2BStr("name="))
                    lngPosBeg = lngPosTmp + 6
                    lngPosEnd = InStrB(lngPosBeg, strBRequest, UStr2BStr(Chr(34)))
                    strName = BStr2UStr(MidB(strBRequest, lngPosBeg, lngPosEnd - lngPosBeg))
                    'Look for an element named 'filename'
                    lngPosFileName = InStrB(lngPosBoundary, strBRequest, UStr2BStr("filename="))
                    'If found, we have a file, otherwise it is a normal form element
                    If lngPosFileName <> 0 And lngPosFileName < InStrB(lngPosEnd, strBRequest, strBBoundary) Then 'It is a file
                        'Get the FileName
                        lngPosBeg = lngPosFileName + 10
                        lngPosEnd = InStrB(lngPosBeg, strBRequest, UStr2BStr(chr(34)))
                        strFileName = BStr2UStr(MidB(strBRequest, lngPosBeg, lngPosEnd - lngPosBeg))
                        'Get the ContentType
                        lngPosTmp = InStrB(lngPosEnd, strBRequest, UStr2BStr("Content-Type:"))
                        lngPosBeg = lngPosTmp + 14
                        lngPosEnd = InstrB(lngPosBeg, strBRequest, UStr2BStr(chr(13)))
                        strContentType = BStr2UStr(MidB(strBRequest, lngPosBeg, lngPosEnd - lngPosBeg))
                        'Get the Content
                        lngPosBeg = lngPosEnd + 4
                        lngPosEnd = InStrB(lngPosBeg, strBRequest, strBBoundary) - 2
                        strBContent = MidB(strBRequest, lngPosBeg, lngPosEnd - lngPosBeg)
                        If strFileName <> "" And strBContent <> "" Then
                            'Create the File object, and add it to the Files collection
                            Set objFile = New clsFile
                            objFile.Name = strName
                            objFile.FileName = Right(strFileName, Len(strFileName) - InStrRev(strFileName, "\"))
                            objFile.ContentType = strContentType
                            objFile.Blob = strBContent
                            m_objFiles.Add strName, objFile
                        End If
                    Else 'It is a form element
                        'Get the value of the form element
                        lngPosTmp = InStrB(lngPosTmp, strBRequest, UStr2BStr(chr(13)))
                        lngPosBeg = lngPosTmp + 4
                        lngPosEnd = InStrB(lngPosBeg, strBRequest, strBBoundary) - 2
                        strValue = BStr2UStr(MidB(strBRequest, lngPosBeg, lngPosEnd - lngPosBeg))
                        'Add the element to the collection
                        m_objForm.Add strName, strValue
                    End If
                    'Move to Next Element
                    lngPosBoundary = InStrB(lngPosBoundary + LenB(strBBoundary), strBRequest, strBBoundary)
            End If
        End Sub

        Private Function BStr2UStr(BStr)
        'Byte string to Unicode string conversion
            Dim lngLoop
            BStr2UStr = ""
            For lngLoop = 1 to LenB(BStr)
                BStr2UStr = BStr2UStr & Chr(AscB(MidB(BStr,lngLoop,1)))
        End Function
        Private Function UStr2Bstr(UStr)
        'Unicode string to Byte string conversion
            Dim lngLoop
            Dim strChar
            UStr2Bstr = ""
            For lngLoop = 1 to Len(UStr)
                strChar = Mid(UStr, lngLoop, 1)
                UStr2Bstr = UStr2Bstr & ChrB(AscB(strChar))
        End Function
        Private Function URLDecode(Expression)
        'Why doesn't ASP provide this functionality for us?
            Dim strSource, strTemp, strResult
            Dim lngPos
            strSource = Replace(Expression, "+", " ")
            For lngPos = 1 To Len(strSource)
                strTemp = Mid(strSource, lngPos, 1)
                If strTemp = "%" Then
                    If lngPos + 2 < Len(strSource) Then
                        strResult = strResult & Chr(CInt("&H" & Mid(strSource, lngPos + 1, 2)))
                        lngPos = lngPos + 2
                    End If
                    strResult = strResult & strTemp
                End If
            URLDecode = strResult
        End Function   
    End Class

    Class clsCollection
    '    This class is a pseudo-collection. It is not a real   '
    '    collection, because there is no way that I am aware   '
    '   of to implement an enumerator to support the          '
    '    For..Each syntax using VBScript classes.              '
        Private m_objDicItems
        Private Sub Class_Initialize()
            Set m_objDicItems = Server.CreateObject("Scripting.Dictionary")
            m_objDicItems.CompareMode = vbTextCompare
        End Sub
        Public Property Get Count()
            Count = m_objDicItems.Count
        End Property
        Public Default Function Item(Index)
            Dim arrItems
            If IsNumeric(Index) Then
                arrItems = m_objDicItems.Items
                If IsObject(arrItems(Index)) Then
                    Set Item = arrItems(Index)
                    Item = arrItems(Index)
                End If
                If m_objDicItems.Exists(Index) Then
                    If IsObject(m_objDicItems.Item(Index)) Then
                        Set Item = m_objDicItems.Item(Index)
                        Item = m_objDicItems.Item(Index)
                    End If
                End If
            End If
        End Function
        Public Function Key(Index)
            Dim arrKeys
            If IsNumeric(Index) Then
                arrKeys = m_objDicItems.Keys
                Key = arrKeys(Index)
            End If
        End Function
        Public Sub Add(Name, Value)
            If m_objDicItems.Exists(Name) Then
                m_objDicItems.Item(Name) = Value
                m_objDicItems.Add Name, Value
            End If
        End Sub
    End Class

    Class clsFile
    '    This class is used as a container for a file sent via '
    '    an http multipart/form-data post.                      '
        Private m_strName
        Private m_strContentType
        Private m_strFileName
        Private m_Blob
        Public Property Get Name() : Name = m_strName : End Property
        Public Property Let Name(vIn) : m_strName = vIn : End Property
        Public Property Get ContentType() : ContentType = m_strContentType : End Property
        Public Property Let ContentType(vIn) : m_strContentType = vIn : End Property
        Public Property Get FileName() : FileName = m_strFileName : End Property
        Public Property Let FileName(vIn) : m_strFileName = vIn : End Property
        Public Property Get Blob() : Blob = m_Blob : End Property
        Public Property Let Blob(vIn) : m_Blob = vIn : End Property

        Public Sub Save(Path)       
            Dim objFSO, objFSOFile
            Dim lngLoop
            Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

            Set objFSOFile = objFSO.CreateTextFile(objFSO.BuildPath(Path, m_strFileName))
            For lngLoop = 1 to LenB(m_Blob)
                objFSOFile.Write MidB(m_Blob, lngLoop, 1)
                objFSOFile.Write Chr(AscB(MidB(m_Blob, lngLoop, 1)))
        End Sub
    End Class

    Monday, March 5, 2007 5:43 PM

All replies

  • User1073881637 posted

    It sounds like the application is buffering the entire image / document in memory.  The cpu is probably pegging while writing the file to a temp file.  I'd check with the vendor for further assistance.

    Saturday, March 17, 2007 12:25 PM