То, что я пытаюсь сделать, похоже, просто: отправить 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, но они не оказали никакого влияния на результат. Кто-нибудь может пролить свет на то, почему это происходит?