WCF WebService не возвращает DataTable

Я начинаю использовать WCF для написания веб-службы вместо старого asmx aspx. Я хочу иметь возможность вернуть JSON, поэтому я не могу сделать это по-старому. Если я возвращаю строку или int, веб-служба работает нормально, но если я пытаюсь вернуть DataTable, она перестает отвечать, и я ничего не получаю. Я попытался отладить, чтобы увидеть, где он взрывается, и он даже не остановится на точке останова.

Мой файл Class выглядит следующим образом:

 public string XMLData(string id)
    {
        return "You requested " + id;
    }


    public string JSONData(string id)
    {
        return "You requested " + id;
    }

    public DataTable TestDT()
    {
        DataTable Testing = new DataTable("TestDT");

        return Testing;
    }

Мой интерфейсный файл выглядит так:

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "xml/{id}")]
    string XMLData(string id);

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "json/{id}")]
    string JSONData(string id);

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "testdt/")]
    DataTable TestDT();

json метод, а также xml Метод работает отлично. Когда я вызываю TestDT, я получаю стандартную страницу IE, на которой нет подключения. Я пробовал это с данными или без данных в таблице с теми же результатами.

Еще одно замечание: когда я запускаю службу WCF локально (Hiting PLAY), мое тестовое приложение показывает теперь службы, которые я вижу так:

Как я могу заставить это работать с данными?

Редактирование #1: Я действительно решил проблему с данными, не возвращающимися. Я, наконец, разочаровался в попытке вернуть набор данных, и вместо этого я создал неровный массив и в итоге возвратил его как JSON. Я отправлю это позже как ответ, чтобы люди знали, как я это сделал. Теперь мне больше всего интересно знать, что такое часть 2. Почему мой тестовый клиент WCF не показывает какие-либо методы (см. Прилагаемое изображение). Моя догадка связана с web.config, поэтому я публикую это ниже:

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="DBDjuggleWS" connectionString="Data Source=localhost;Initial Catalog=PrayUpDev;Persist Security Info=True;User=DjuggleMaster;Password=DJPassword!" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name ="PrayUpService.PrayUp" behaviorConfiguration="ServiceBehaviour">
        <endpoint address="" binding="webHttpBinding" contract="PrayUpService.IPrayUp" behaviorConfiguration ="web"></endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

1 ответ

Ты должен вернуться DataSet вместо DataTable но возврат наборов данных из веб-сервисов обычно не считается "хорошей практикой". здесь вы можете прочитать об этом: почему возврат набора данных или таблицы данных из службы WCF не является хорошей практикой? Какие есть альтернативы?

я настоятельно рекомендую использовать DataSet’s методы для получения данных в формате XML и передачи строки XML вместо DataSet Сам на службу.

PassDataSet(dsDataSet.GetXmlSchema(), dsDataSet.GetXml())
Другие вопросы по тегам