Можно ли принудительно принудить конечную точку REST WCF принять формат сообщения Raw? - PullRequest
3 голосов
/ 26 января 2012

У меня есть веб-сервис с конечными точками SOAP и REST. Я должен принимать запросы от клиента, которые не имеют никакого контроля над моей конечной точкой REST. В настоящее время клиент получает ответ 400, а журнал отслеживания на моем сервере показывает эту ошибку:

The incoming message has an unexpected message format 'Raw'. 
The expected message formats for the operation are 'Xml', 'Json'. 

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

Так что, думаю, мне нужно выяснить, могу ли я заставить эту конечную точку принять сообщение в любом случае. Это должно быть легко, правда, ребята? ... ребята? ... верно?

Ответы [ 2 ]

8 голосов
/ 26 января 2012

Если вы заставите операцию принять поток, то вы сможете самостоятельно проанализировать поступающие данные и решить, что с ними делать.ContentType HTTP-запроса должен сообщать вам, что находится в потоке

В качестве примера, скажем, у вас есть служба, которая позволяет загружать изображения.Вы можете захотеть выполнить различные виды обработки изображения в зависимости от типа изображения.Итак, у нас есть контракт на обслуживание следующим образом:

[ServiceContract]
interface IImageProcessing
{
    [OperationContract]
    [WebInvoke(Method="POST", UriTemplate = "images")]
    void CreateImage(Stream stm);
}

Реализация проверяет тип содержимого запроса и выполняет обработку в зависимости от него:

public void CreateImage(Stream stm)
{
    switch(WebOperationContext.Current.IncomingRequest.ContentType)
    {
      case "image/jpeg":
          // do jpeg processing on the stream
          break;

      case "image/gif":
          // do GIF processing on the stream
          break;

      case "image/png":
          // do PNG processing on the stream
          break;

      default:
          throw new WebFaultException(HttpStatusCode.UnsupportedMediaType);
   }
}
0 голосов
/ 26 января 2012

Насколько я понимаю, REST требует либо JSON, либо XML, проверьте здесь:

WCF REST: XML, JSON или оба?

WCF (WindowsCommunication Foundation) - это новый стандарт для построения сервисов с помощью .NET, а REST (REpresentational State Transfer) был очень популярным методом при создании сервисов, а не только в .NET-пространстве.Со службами вы транспортируете сериализованные данные по каналу, с которым нужно работать, и существует несколько методов сериализации:

Двоичный: Не для служб REST , но обеспечивает наименьший размер пакета.Каждый конец должен четко знать, как обрабатывать данные.

SOAP: долгосрочный стандарт для веб-сервисов.Очень описательный, но очень большой размер пакета из-за количества метаданных.

XML (POX): Обычный Старый XML предоставляет только данные со структурой без метаданных, оставляя меньший размер пакета.

JSON (нотация объектов JavaScript): новый и более поздний стандарт с размером пакета, аналогичным обычному XML-каналу, но может использоваться непосредственно в JavaScript, что делает его наилучшим вариантом при использовании сервиса из jQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...