Тело ответа представляет собой поток байтов.См. Сервисную документацию для разрешенных типов контента - PullRequest
0 голосов
/ 04 февраля 2011

Когда я использовал REST для вызова службы WCF, метод пропускается со следующей ошибкой:

Тело ответа представляет собой поток байтов. Смотрите сервисную документацию для разрешенные типы контента.

Я занимаюсь размещением объектов в памяти, а затем пытаюсь их сериализовать в виде строки JSON. Для этого у меня есть интерфейс к моему контракту на обслуживание:

 [ServiceContract]
    public interface IDashboardService
    {

        [WebGet(UriTemplate = "dashboard/group/id/{id}", ResponseFormat=WebMessageFormat.Json)]
        [OperationContract]
        Stream GetGroupById(string id);


    }

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

public class Dashboard : GroupBase, Contracts.IDashboardService
{
        public Dashboard() : base()
        {

            if (!ServiceSecurityContext.Current.PrimaryIdentity.IsAuthenticated)
                throw new WebException("Unauthorized: Class: Dashboard, Method: Dashboard()",
                    System.Net.HttpStatusCode.Forbidden);

        }

        public override System.IO.Stream GetGroupById(string id)
        {
            return base.GetGroupById(id);
        }

}

Вот базовый метод:

 public virtual Stream GetGroupById(string id)
        {
            byte[] bytes = null;

            var groupId = System.Convert.ToInt32(id);
            var serializer = new JavaScriptSerializer();

            switch (groupId)
            {
                case 0: // regions
                    var regions = GroupRepository.GetAllRegions();
                        bytes = Encoding.UTF8.GetBytes(serializer.Serialize(regions));
                    break;
                case 1: // customers
                    var customers = CustomerRepository.GetAllCustomers();
                        bytes = Encoding.UTF8.GetBytes(serializer.Serialize(customers));
                    break;
            }

            return new MemoryStream(bytes);

        }

Есть идеи, как я могу заставить это работать? Спасибо.

Ответы [ 2 ]

1 голос
/ 26 сентября 2012

Мне пришлось вставить эту строку перед возвратом потока памяти, чтобы получить его в формате JSON:

WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
1 голос
/ 04 февраля 2011

Вы не можете вернуть поток, а затем указать WCF отформатировать его как JSON.Просто удалите атрибут MessageFormat и установите заголовок типа содержимого вручную на application / Json

...