Завершение веб-службы SOAP до обработки всех данных - PullRequest
0 голосов
/ 06 марта 2012

У меня есть веб-сервис SOAP, который я тестирую локально в своей среде разработки. У меня есть тестовое приложение Winforms, которое использует этот веб-сервис на localhost.

Когда вызывается веб-служба, она предназначена для чтения из таблицы в БД MSSQL 2008 и возврата набора данных (эта часть работает).

Приложение My Winforms выполняет итерацию по строкам набора данных и вставляет строки набора данных в локальную базу данных. По сути, я копирую данные из одной таблицы в одной базе данных в таблицу другой базы данных (1: 1) через веб-сервис.

Проблема ..

.. в том, что я получаю X тысяч строк через веб-сервис, и когда я перебираю их в своем приложении Winforms, код просто перестает зацикливаться на 200-300 строк. Я установил точку останова и, используя «Непосредственное окно» в Visual Studio, проверил, что есть X тысяч строк с данными против них.

Проект является старым веб-сайтом .NET 2.0, он использует старую версию Microsoft Enterprise Library v2.0.50727 для доступа к данным.

Вот проблемный код в приложении Winforms:

public static int PopulateLocalTable(DataSet ds, string DBInstance, string DBServer)
{
    if (ds.Tables.Count == 0)
    {
        return 0;
    }
    else if (ds.Tables[0].Rows.Count == 0)
    {
        return 0;
    }
    else
    {
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            using (var conn = new SqlConnection(string.Format("Data Source={0}; Initial Catalog={1}; Integrated Security=True;", DBInstance, DBServer)))
            {
                conn.Open();

                using (var command = new SqlCommand("dbo.myStoredProc", conn))
                {
                    command.CommandType = CommandType.StoredProcedure;

                        //Added for debugging purposes.
                    int id = Convert.ToInt32(dr["ID"]);
                    int teamid = Convert.ToInt32(dr["TeamID"]);
                    int companyid = Convert.ToInt32(dr["CompanyID"]);
                    string team_name = Convert.ToString(dr["Team_Name"]);
                    DateTime date = Convert.ToDateTime(dr["Date"]);
                    string aaa = Convert.ToString(dr["aaa"]);
                    int bbb = Convert.ToInt32(dr["bbb"]);
                    decimal ccc = Convert.ToDecimal(dr["ccc"]);
                    DateTime ddd = Convert.ToDateTime(dr["ddd"]);

                    command.Parameters.Add(new SqlParameter("@ID", id));
                    command.Parameters.Add(new SqlParameter("@TeamID", teamid));
                    command.Parameters.Add(new SqlParameter("@CompanyID", companyid));
                    command.Parameters.Add(new SqlParameter("@Team_Name", team_name));
                    command.Parameters.Add(new SqlParameter("@Date", date));
                    command.Parameters.Add(new SqlParameter("@aaa", aaa));
                    command.Parameters.Add(new SqlParameter("@bbb", bbb));
                    command.Parameters.Add(new SqlParameter("@ccc", ccc));
                    command.Parameters.Add(new SqlParameter("@ddd", ddd));

                    command.ExecuteNonQuery();
                }
            }
        }

        return ds.Tables[0].Rows.Count;
    }
}

Вот мои настройки app.config для приложения Winforms:

 <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="Service1Soap" closeTimeout="01:00:00" openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="6553600" maxBufferPoolSize="524288" maxReceivedMessageSize="6553600" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
                        <message clientCredentialType="UserName" algorithmSuite="Default"/>
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:11288/Service1.asmx" binding="basicHttpBinding" bindingConfiguration="Service1Soap" contract="ServiceReference1.Service1Soap" name="Service1Soap"/>
        </client>
    </system.serviceModel>

Если я попытался изменить время ожидания соединения / команды, и я не могу заставить его работать. Это похоже на то, что соединение истекло или поток ограничен. Я надеюсь, что это просто настройка конфигурации .. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Проверьте свойство BufferResponse веб-метода.Значение по умолчанию TRUE (ответ буферизуется), но для большого объема данных буферизация не рекомендуется: попробуйте установить его в FALSE.

См. msdn .

1 голос
/ 06 марта 2012

Ваша проблема в том, что у вас есть создание command вне цикла, поэтому вы в конечном итоге добавляете все больше и больше параметров.

Создайте новый объект command внутри цикла.

Вы можете использовать оператор using, чтобы убедиться, что соединения и команды очищены:

using(var connection = new SqlConnection("..."))
{
    connection.Open();

    using(var command = connection.CreateCommand())
    {
        // do stuf
    }
}

Обновление : теперь я заметил, что параметры очищены.В любом случае попробуйте создать команду в цикле:)

...