WCF WebInvoke ResponseFormat

У меня есть служба перезапуска WCF, и я хочу, чтобы пользователь мог выбрать, какой формат запроса он хочет, у меня есть украшения

    [OperationContract]
    [WebInvoke(Method = "GET", 
        ResponseFormat = WebMessageFormat.Xml, 
        BodyStyle = WebMessageBodyStyle.Wrapped, 
        UriTemplate = "getstreamurl?ch={ch}&format=xml")]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "getstreamurl?ch={ch}&format=json")]

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

    [WebInvoke(Method = "GET", 
        ResponseFormat = WebMessageFormat.Xml, 
        BodyStyle = WebMessageBodyStyle.Wrapped, 
        UriTemplate = "getstreamurl?ch={ch})]

    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "getstreamurl?ch={ch}&format=json")]

Где XML является значением по умолчанию, если я пытаюсь вызвать сервисный метод через браузер, он говорит мне, что:

UriTemplateTable не поддерживает несколько шаблонов, которые имеют эквивалентный путь в качестве шаблона 'getstreamurl? Ch={ch}', но имеют разные строки запроса, где все строки запроса не могут быть устранены неоднозначностью с помощью литеральных значений. Смотрите документацию для UriTemplateTable для более подробной информации.

Их, очевидно, можно различить, но кажется, что WCF только читает доводы, и это все... Есть предложения?

2 ответа

Решение

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

Марк

Обновление: как правильно отмечает Стив Мичелотти, это автоматическое переключение между JSON и XML теперь может быть достигнуто в WCF 4.0. WCF 4.0 имеет улучшенную поддержку REST, которая также включает функцию выбора формата сообщения, основанную на HTTP-заголовках принятия.

Дополнительные сведения о новых функциях WCF 4.0 см. В разделе "Введение разработчика в WCF 4.0".

Вы можете сделать это, если ваша служба отдыха настроена автоматически, выберите тип ответа.

Затем по запросу клиента просто добавьте нужный заголовок. Accept: application/json

Другие вопросы по тегам