Вопрос

Вот тривиальный пример, который должен возвращать строку «Hello World». Тем не менее, браузер отображает что-то вроде SGVsbG8gV29ybGQ=. Отказ Что является правильным способом вернуть простой текст из службы в стиле Oldskul?

Пожалуйста, знайте, что:

  1. Я не могу вернуть строку: три символа Unicode будут автоматически предложены, а устаревший клиент HTTP не сможет взаимодействовать.

  2. Я мог бы вернуть Message, но все еще должен продолжать анализ функциональности для извлечения data Переменная. Смешивание Message а также int Типы в том же методе подпись не допускаются AFAIK.

    [ServiceContract(SessionMode=SessionMode.NotAllowed)] 
    public interface IHello 
    {
      [WebGet(UriTemplate = "manager?data={data}")]
      [OperationContract]
      Byte[] DoIt(int data);
    }

    public class Hello : IHello { public Byte[] DoIt(int data) { return Encoding.ASCII.GetBytes("HelloWorld"); } }

ОБНОВИТЬ: Это не гибберский, но правильно закодировал ответ. Однако формат не то, что я ожидаю получить. Я выяснил (в качестве господа внизу предлагаю), что максимальный контроль формата обмена сообщениями транспорта достигнут с Message сорт. Однако, если я использую один - я потеряю возможность разбора запроса (UriTemplate атрибут). Следовательно, было бы здорово знать, как интегрировать Message с участием UriRequest.

PS. Если «чистая» интеграция невозможна - чем самый элегантный обходной путь? Есть ли код, который проводится за проволочной занавесом, который я могу одолжить и использовать в моей реализации, пожалуйста?

Это было полезно?

Решение 2

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

  public class Hello : IHello
  {
        [WebGet(UriTemplate = "manager")]
        [OperationContract]
        Message DoIt();
  }

  public class Hello : IHello
  {
        public Message DoIt()
        {
          var webContext = WebOperationContext.Current;
          var request = webContext.IncomingRequest;
          var queryParameters = request.UriTemplateMatch.QueryParameters;
          var data = queryParameters["data"];

          var result = new StringBuilder(@"
              <?xml version='1.0'?>
              ...
          ");

          var response = webContext.CreateTextResponse(result.ToString(), "application/xml", Encoding.ASCII);

          return response;
        }
  }

Если есть лучшая альтернатива - было бы идеально, чтобы узнать об этом.

Другие советы

Это не Gibberish - это закодированная базовая версия байтов ASCII для «Hello World» (с пространством).

Когда вы задаете веб-службу для передачи байтов, он будет использовать Base64 ... Ваш клиент веб-сервиса будет автоматически выполнять декодирование Base64, чтобы вернуть исходные байты.

(Я бы не предложил использовать Encoding.ASCII, Польмите вас.)

Неясно, каков ваш «наследийный HTTP Client» или что ожидает, поэтому мы не можем действительно сказать, является ли возвращение байтового массива на самом деле лучший ответ или нет.

Спецификация SOAP заявляет, что необработанные двоичные данные должны быть закодированы Base64. Так что поведение, которое вы считаете правильным.

Если вам нужно передавать данные символов ASCII. Вы можете использовать один договор сообщения и необработанное сообщение.

Message DoIt(DoItRequest request)

Необработанное сообщение создаст ответ, содержащий данные ASCII. Договор сообщения используется для получения указанного вами параметра INT:

[MessageContract]
public class DoItRequest
{
  [MessageBodyMember] public int data;
}

Этот страница Объясняет, как работать с классом сообщений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top