Должен ли Content-Type запроса POST или PUT указываться как application / x-www-form-urlencoded в службе WCF ReSTful? - PullRequest
1 голос
/ 20 января 2010

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

    [WebInvoke(Method = "PUT", UriTemplate = "/content/add", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat=WebMessageFormat.Xml)]
    [OperationContract]
    Stream AddContent(Stream input);

Глагол здесь не имеет значения; Я мог бы легко заменить «PUT» на «POST» и получить тот же результат. Реализация вышеуказанного способа заключается в следующем:

    public Stream AddContent(Stream input)
    {
        WebOperationContext.Current.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.Created;
    }

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

 User-Agent: Fiddler
 Host: myhost.com
 Content-Length: 771
 Content-Type: text/xml && application/xml; charset: utf8
 <xmlDataGoesHere></xmlDataGoesHere>

Неверное значение для Content-Type, я знаю, я просто использую его, чтобы проиллюстрировать Content-Type, который я пробовал. Если я нажимаю «Выполнить» в Fiddler, код ответа от моего сервиса - 400 Bad Request. Стоит отметить, что мой метод обслуживания на самом деле не срабатывает в этом secnario, запрос умирает еще до того, как он туда попадет. Поэтому после обильного чтения и процесса исключения я изменил Content-Type на:

 Content-Type: application/x-www-form-urlencoded

Если я выполню запрос Fiddler, код состояния, возвращаемый моей службой, будет 201 Создан. Есть ли что-то, чего мне не хватает, почему я не могу установить Content-Type ни на что, кроме URLEncoded? Я попытался настроить свойства BodyStyle и RequestFormat в ServiceContract, но они не оказали никакого влияния на результат. Кто-нибудь может пролить свет на то, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 20 января 2010

Хорошо, я понял это, и проблема, с которой я столкнулся, заключается в «дизайне». Я обнаружил пост-модель программирования WCF "Raw" - получение произвольных данных "в http://blogs.msdn.com/carlosfigueira/, что привело к решению. Решение здесь состояло в том, чтобы создать мой собственный customBinding, который будет возвращать необработанный кодировщик все время, как указал блог. Спасибо за помощь.

0 голосов
/ 20 января 2010

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

Взгляните на это http://wcfrestcontrib.codeplex.com/

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