2012-01-04 4 views
2

Я постоянно становился все более расстроенным с помощью WCF и возвращаемых типов. В настоящее время я работаю над методом, который считывает данные из SQL, создает новые объекты определенного типа на основе количества полученных данных и затем присваивает значения объектов данным, полученным из SQL.WCF возвращает потоки или строки?

У меня есть функциональность для сериализации в JSON и XML. В идеале я хотел бы преобразовать свои сериализованные объекты в строки, чтобы я мог прочитать ответ из браузера в преобразованном виде, надеюсь, следующие примеры будут более объяснительными.

Преимущества, которые я получаю от того, когда я сериализации своих объектов, и возвращать поток, что форматирование является совершенным, и он использует свои DataMembers в классах, так что ответ будет в JSON будет выглядеть следующим образом:

{"GameID":1,"ProposalID":5} 

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

Если я вернуть строку, я получаю данные, однако он не отформатирован с использованием DataMembers или любой из преимуществ от сериализации и информация, поэтому довольно пустой и не имеет смысла:

"3151" 

As вы можете видеть из этого примера, я также извлекаю 2 SQL-поля по 2 переменные. И я не уверен, как добавить результаты в поток, поскольку в настоящий момент он возвращает только последний результат (5,1), не говоря уже о возврате их должным образом.

Хотя я не уверен, если я могу вставить URL чего-то, что я хотел бы достичь, вот это все равно: http://api.justin.tv/api/user/show/justin.json

Моя немедленная мысль была бы использовать XMLWriter или какой-то к вручную напишите информацию, однако я хотел бы иметь возможность выплачивать дивиденды для функций сериализации и DataMember.

Мой обратный поток Код:

foreach (MatchProposal proposal in Proposals) 
{ 
    returnStream = WriteJSON(SerializeToJSON(proposal)); 
} 

public MemoryStream SerializeToJSON(object serializeObject) 
{ 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(serializeObject.GetType()); 
    MemoryStream memoryStream = new MemoryStream(); 
    serializer.WriteObject(memoryStream, serializeObject); 
    return memoryStream; 
} 

public Stream WriteJSON(MemoryStream memoryStream) 
{ 
    string json = Encoding.Default.GetString(memoryStream.ToArray()); 
    return new System.IO.MemoryStream(ASCIIEncoding.Default.GetBytes(json)); 
} 

И мой невыполненным простой Строка возвращения код:

WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json; 

Он просто возвращает данных SQL.

Надеюсь, я дал достаточно информации в то, что я сделал до сих пор, и то, что я хотел бы получить из приведенного примера. В Short Я хотел бы получить то, что написано в API Justin.tv, я хотел бы воспользоваться сериализацией, однако, когда я просматриваю обратный поток в браузере, меня приветствует загрузка файла, которую я могу открыть в блокноте, который не идеален.

Спасибо за любые советы, если я по-видимому, заблудился в какой-то момент, или какие-либо резолюции, я могу реализовать :)

С уважением, Рональд

+1

Вы применяете ContentType к ответу, например. 'text/xml', или' text/json'? –

+0

@MatthewAbbott no нет объявленного типа контента, требуется ли для возвращения идеального потока? – Rodney

+0

Я бы предположил, что это, вероятно, проблема. Поскольку вы возвращаете 'Stream' вместо объекта, я думаю, что не указан тип содержимого, поэтому браузер не знает, как его обрабатывать, - это вызывает сообщение загрузки. Попробуйте добавить тип контента 'text/json', чтобы узнать, вызывает ли это проблему. Затем я проверял, какой тип контента запрашивается, и чтобы ваша служба адаптировалась к этому. –

ответ

5

Вы подаете на ContentType в ответ, например, text/xml, или text/json?

Я бы предположил, что это может быть проблемой.Поскольку вы возвращаете поток вместо объекта, я думаю, что тип содержимого не указан, поэтому браузер не знает, как его обрабатывать, - это вызывает запрос на загрузку. Попробуйте добавить тип контента text/json, чтобы узнать, не вызывает ли это проблемы. Затем я проверял, какой тип контента запрашивается, и чтобы ваша служба адаптировалась к этому.

Обновление в отношении добавления второго объекта к потоку, я бы порекомендовал против попытки просто привязать его к концу потока. Вместо этого, почему бы не построить составную модель, которая содержит два свойства, представляющие объекты, которые хотите сериализовать и передать обратно из службы?

+0

Спасибо, это то, что я искал. – Rodney

Смежные вопросы