WebMethod () работает медленно при каждом выполнении по сравнению с тем, когда я запускаю его как приложение для Windows - PullRequest
2 голосов
/ 12 марта 2011

Я разработал приложение, которое взаимодействует с IBM ClearQuest. Проблема в том, что когда я запускаю все локально, например, запускаю локальный веб-сервис, а затем локальную страницу ASP, все происходит со скоростью, на которую я рассчитываю. Когда я размещаю веб-сервис (предварительно скомпилированный) на сервере и запускаю веб-страницу через сервер, вызов веб-метода занимает как минимум 10-кратное количество времени, которое он должен. Я не знаю, почему это происходит. Я сделал консольное приложение, в котором есть соответствующая функция, и выполняю ее на сервере и локально, и они оба возвращают одинаковое количество времени (примерно), только когда я перехожу к выполнению через веб-метод, все переходит в улитку. Есть идеи? Это происходит каждый раз, когда происходит не только первый звонок.

WebMethod:

  Public Function RetrieveQueryResults(ByRef cqSession As ClearQuestOleServer.Session, _
                                         ByVal sqlStmt As String) As List(Of SearchResultsSingleIssue)

    Dim numCols As Integer, status As Integer, columnIdx As Integer
    Dim numRows As Integer
    Dim rowContents As String = ""
    Dim colValue As New Object
    Dim colLabel As New Object
    Dim allitems As New List(Of SearchResultsSingleIssue)
    Dim results As New SearchResultsSingleIssue
    Dim cqResultSet As ClearQuestOleServer.OAdResultset

    cqResultSet = cqSession.BuildSQLQuery(sqlStmt)
    cqResultSet.Execute()

    ' Get the number of columns returned by the query.
    numRows = 0
    numCols = cqResultSet.GetNumberOfColumns
    status = cqResultSet.MoveNext


    ' Collect query results.
    Do While status = AD_SUCCESS
        results = New SearchResultsSingleIssue
        numRows = numRows + 1

        For columnIdx = 1 To numCols

            colLabel = cqResultSet.GetColumnLabel(columnIdx)
            colValue = cqResultSet.GetColumnValue(columnIdx)

            'Make sure that we dont pass along a null reference
            If colValue = Nothing Then
                colValue = ""
            End If

            Select Case colLabel
                Case "ID"
                    results.IssueID = colValue
                Case "HEADLINE"
                    results.Headline = colValue
                Case "NAME"
                    results.State = colValue
                Case "OE_CONTACT"
                    results.OEContact = colValue
                Case "DESCRIPTION"
                    results.Further_Description = colValue
                Case "PRODUCT_NAME"
                    results.Product_Name = colValue
                Case "FUNCTIONAL_AREA"
                    results.Functional_Area = colValue
                Case "SUBTOPIC"
                    results.Subtopic = colValue
                Case "FOUND_VERSION"
                    results.Found_In = colValue
                Case "SCHEDULED_VERSION"
                    results.Scheduled_For = colValue
                Case "SYMPTOMS"
                    results.Symptoms = colValue
                Case "AFFECTED_SYSTEMS"
                    results.Affected_System_Types = colValue
                Case "ISSUE_TYPE"
                    results.Issue_Type = colValue
                Case "ASSIGNED_TO"
                    results.Assigned_Developer = colValue
                Case "TESTED_BY"
                    results.Assigned_Tester = colValue
                Case "BUILT_VERSION"
                    results.Built_In = colValue
                Case "TESTED_VERSION"
                    results.Tested_In = colValue
                Case "NOTES_LOG"
                    results.Notes_Log = colValue
                Case "CUSTOMER_SEVERITY"
                    results.Severity = colValue
                Case "PRIORITY"
                    results.Priority = colValue

            End Select

        Next columnIdx

        ' Add the query row result to the compiled list of all rows.
        allitems.Add(results)
        status = cqResultSet.MoveNext

    Loop

    Return allitems

End Function

Метод локального применения Windows:

    private void button2_Click(object sender, EventArgs e)
    {
        start = DateTime.Now.TimeOfDay.Seconds;

        int numCols = 0;
        int status = 0;
        int columnIdx = 0;
        int numRows = 0;
        string rowContents = "";
        string colValue;
        string colLabel;
        List<SearchResultsSingleIssue> allitems = new List<SearchResultsSingleIssue>();
        SearchResultsSingleIssue results = new SearchResultsSingleIssue();
        ClearQuestOleServer.OAdResultset cqResultSet = default(ClearQuestOleServer.OAdResultset);

        cqResultSet = (ClearQuestOleServer.OAdResultset)ClearQuestSession.BuildSQLQuery(sqlStatement); 
        cqResultSet.Execute();

        // Get the number of columns returned by the query.
        numRows = 0;
        numCols = cqResultSet.GetNumberOfColumns();
        status = cqResultSet.MoveNext();


        // Collect query results.
        while (status == 1)
        {
            results = new SearchResultsSingleIssue();
            numRows = numRows + 1;


            for (columnIdx = 1; columnIdx <= numCols; columnIdx++)
            {
                colLabel = (string)cqResultSet.GetColumnLabel(columnIdx);
                colValue = (string)cqResultSet.GetColumnValue(columnIdx);
                //Make sure that we dont pass along a null reference
                if (colValue == null)
                {
                    colValue = "";
                }

                switch (colLabel)
                {
                    case "ID":
                        results.IssueID = colValue;
                        break;
                    case "HEADLINE":
                        results.Headline = colValue;
                        break;
                    case "NAME":
                        results.State = colValue;
                        break;
                    case "OE_CONTACT":
                        results.OEContact = colValue;
                        break;
                    case "DESCRIPTION":
                        results.Further_Description = colValue;
                        break;
                    case "PRODUCT_NAME":
                        results.Product_Name = colValue;
                        break;
                    case "FUNCTIONAL_AREA":
                        results.Functional_Area = colValue;
                        break;
                    case "SUBTOPIC":
                        results.Subtopic = colValue;
                        break;
                    case "FOUND_VERSION":
                        results.Found_In = colValue;
                        break;
                    case "SCHEDULED_VERSION":
                        results.Scheduled_For = colValue;
                        break;
                    case "SYMPTOMS":
                        results.Symptoms = colValue;
                        break;
                    case "AFFECTED_SYSTEMS":
                        results.Affected_System_Types = colValue;
                        break;
                    case "ISSUE_TYPE":
                        results.Issue_Type = colValue;
                        break;
                    case "ASSIGNED_TO":
                        results.Assigned_Developer = colValue;
                        break;
                    case "TESTED_BY":
                        results.Assigned_Tester = colValue;
                        break;
                    case "BUILT_VERSION":
                        results.Built_In = colValue;
                        break;
                    case "TESTED_VERSION":
                        results.Tested_In = colValue;
                        break;
                    case "NOTES_LOG":
                        results.Notes_Log = colValue;
                        break;
                    case "CUSTOMER_SEVERITY":
                        results.Severity = colValue;
                        break;
                    case "PRIORITY":
                        results.Priority = colValue;

                        break;
                }

            }

            // Add the query row result to the compiled list of all rows.
            allitems.Add(results);
            status = cqResultSet.MoveNext();


        }

        seconds = (DateTime.Now.TimeOfDay.Seconds - start);
        label3.Text = seconds.ToString();



    }

Код должен быть выполнен примерно через ... 6 секунд.

1 Ответ

2 голосов
/ 12 марта 2011

Обычно такие вещи сводятся к проблемам с разрешениями. Например, веб-служба ожидает анонимного пользователя или использует проверку подлинности Windows. Это также повлияет на веб-сайт. Так что я бы начал изучать это.

Несмотря на это, я настоятельно рекомендую вам опубликовать свой код на https://codereview.stackexchange.com/. Вы можете получить некоторую обратную связь относительно того, как лучше структурировать то, что вы сделали.

...