Веб-служба .NET 2.0 не возвращает DataTable

У меня есть метод веб-сервиса, определенный так:

[WebMethod]
public DataTable GetResponseCodeTypes()
{
  // connect to database and retrieve results,
  // then populate and return a DataTable
}

Метод был проверен с помощью тестовой формы веб-сервиса и возвращает DataTable, как и ожидалось:

<?xml version="1.0" encoding="utf-8"?>
<DataTable xmlns="http://tempuri.org/">
  <DocumentElement xmlns="">
    <ResponseCodeTypes>
      <CodeTypeId>1</CodeTypeId>
      <Descrip>RPC</Descrip>
    </ResponseCodeTypes>
    <ResponseCodeTypes>
      <CodeTypeId>2</CodeTypeId>
      <Descrip>Non-RPC</Descrip>
    </ResponseCodeTypes>
    <ResponseCodeTypes>
      <CodeTypeId>3</CodeTypeId>
      <Descrip>No connect</Descrip>
    </ResponseCodeTypes>
  </DocumentElement>
</DataTable>

Однако, когда я вызываю метод GetResponseCodeTypes из внешнего кода C#, он не только возвращает DataSet вместо DataTable, но и возвращает DataSet без таблиц.

Затем я пошел и изменил класс-заглушку (сгенерированный Visual Studio при добавлении веб-ссылки), чтобы вместо этого возвращать DataTable. Это работает, поскольку я получаю DataTable обратно, но указанное DataTable не имеет определенных столбцов или строк.

Я знаю, что в .NET 1.x было невозможно вернуть DataTable из метода веб-сервиса (вам пришлось обернуть его в DataSet), но у меня сложилось впечатление, что это было исправлено в .NET 2.x...

В чем проблема?

ИЗМЕНИТЬ:

Веб-сервис — это .NET 2.0, работающий на Linux-системе под Mono 2.4.2.3; в то время как внешний код разрабатывается в .NET 2.0 на машине с Windows XP, работающей под управлением VS2008 с пакетом обновления 1 (SP1).


person Ian Kemp    schedule 29.09.2009    source источник


Ответы (2)


По этой ссылке DataTable и Webservice в ADO.NET 2.0

Обратите внимание, что сама DataTable поддерживает веб-службы, единственное, что нарушено, — это генерация прокси, после создания прокси во время выполнения экземпляр DataTable может передаваться с помощью веб-служб.

На промежуточный период вы можете выбрать любой из следующих обходных путей:

A) Вручную создайте прокси-класс на стороне клиента для каждого веб-сервиса, использующего DataTable.

B)

  1. скомпилируйте и GAC прикрепленный файл SchemaImporterExtension.
  2. добавьте его к существующим расширениям в machine.config, используя полное имя сборки

  3. Используйте стандартные механизмы (например, xsd.exe или Visual Studio) для создания прокси-класса на стороне клиента.

person RameshVel    schedule 29.09.2009
comment
Спасибо, Рамеш. Я попробовал это, но это не имело никакого значения для прокси-класса, сгенерированного VS/wsdl.exe. Я отредактировал свой исходный пост, добавив дополнительную информацию, может ли проблема быть в Mono? - person Ian Kemp; 29.09.2009

Как правило, вы не должны возвращать DataTable, DataSet или любой другой тип, относящийся к .NET. Естественно, они будут работать только с клиентами .NET.

person John Saunders    schedule 06.01.2010
comment
Это не проблема, потому что я точно знаю, что веб-сервис никогда не будет использоваться ничем, кроме .NET. - person Ian Kemp; 19.01.2010