Вернуть несколько ответов от WCF - PullRequest
7 голосов
/ 15 сентября 2010

У меня есть одна служба WCF и один единственный метод с именем GetStudentList () в службе. Работает нормально, когда возвращается один ответ. Примерно таки json both. как-то так

  [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[WebGet(ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
List<Student> GetStudentList();

возможно ли это? если да то как?

Ответы [ 3 ]

19 голосов
/ 15 сентября 2010

Это возможно в .NET 4.0, но не так, как вы указали. .NET 4.0 добавляет новый параметр в поведение WebHttp:

  <endpointBehaviors>
    <behavior name="WebHttp">
      <webHttp automaticFormatSelectionEnabled="true" />
    </behavior>
  </endpointBehaviors>

При использовании автоматического выбора формата формат ответа основан на:

  • Принять заголовок из запроса
  • Тип содержимого запроса
  • Формат по умолчанию, указанный для операции
  • Формат по умолчанию, указанный в поведении webHttp

Так что, если вы позвоните в службу REST с запросом JSON, вы получите JSON. Если вы позвоните по запросу POX, вы получите XML. Полное описание автоматического выбора формата в MSDN .

3 голосов
/ 15 сентября 2010

Я не думаю, что можно вернуть объект как Json, так и XML, используя один вызов.В этом отношении воспринимайте WCF как обычный вызов метода;Вы вызываете один метод, вы получаете одно сериализованное возвращаемое значение.Как только служба вернула один ответ вызывающей стороне, вызов завершен.

Тщательно продумайте, почему вы хотите использовать оба типа ответа;они оба являются информативными, универсальными стандартами для сериализации объектов, и при использовании WCF вам понадобятся оба, только если вы используете текст сериализованного ответа напрямую.Если это вообще возможно, я бы рефакторинг клиентов для работы с тем же типом ответа.

Самый простой обходной путь, если действительно нужны два типа, было бы обеспечить две "перегрузки" этого метода, и сделать каждыйТип клиента достаточно умен, чтобы знать, какой вызов ему нужно сделать.Поскольку разница не в сигнатуре метода, это не настоящая перегрузка;вам придется разделить их либо по имени (GetStudentListJSON vs GetStudentListXML), либо путем размещения методов в разных классах обслуживания.

Вы также можете всегда возвращать один тип ответа и конвертировать на стороне клиента путем десериализации / повторной сериализации, когда вам нужно, чтобы объект сериализовался в другом формате.Это требует от вас использования .NET-кода, который вы контролируете на стороне клиента вызова.

1 голос
/ 15 сентября 2010

Я не знаю, как можно получить 2 выхода из сервисной операции. Вы всегда можете получить XML (сериализованный DataContract) и затем его «JSON Serialize». Вот как вы можете это сделать.

List<Student> studentList = GetStudent();
string jsonString = JsonSerialize(studentList.GetType(), studentList);

А затем добавьте эту функцию в служебный класс:

public static string JsonSerialize(Type type, object objectGraph)
        {
            MemoryStream memoryStream = new MemoryStream();

            try
            {
                System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(type);
                serializer.WriteObject(memoryStream, objectGraph);
                return Encoding.Default.GetString(memoryStream.ToArray());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (memoryStream != null) memoryStream.Close();
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...