2010-09-15 6 views
6

У меня есть одна служба WCF и один единственный метод, названный GetStudentList() в service.It работает хорошо, когда это возвращение одного response.Something как этотВозвращение множественного ответа от WCF

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

Но я хочу, чтобы вернуть несколько ответ, т.е. xml и json both.something like this

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

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

+0

Нет, для этого вам нужны два отдельных метода ('GetStudentList()' и 'GetStudentListJson()'). –

+0

Дубликат с - http: // stackoverflow.com/questions/1008706/wcf-webinvoke-responseformat – Jirapong

ответ

19

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

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

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

  • Accept заголовка из запроса
  • Типа содержимого из запрос
  • по умолчанию формат указания на операции формат
  • по умолчанию, указанного в поведении webHttp

Итак, если вы позвоните в службу REST с запросом JSON, вы получите JSON. Если вы вызываете его с помощью запроса POX, вы получите XML. Полное описание автоматического выбора формата находится в MSDN.

3

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

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

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

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

+0

Это можно сделать в 4.0. Это неправильный способ сделать это. – Ankit

1

Я не знаю, как вы можете получить 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(); 
      } 
     } 
Смежные вопросы