Ошибка с клиентом WCF REST (POX) при создании 201 и отсутствии ответа
Я создаю прокси WCF POX, используя базовый базовый класс ClientBase по фиксированной спецификации.
Спецификация имеет элементы, созданные с помощью вызова POST к конечной точке. Без пакета ответа тела и статуса заголовка (201 Created) и идентификатора элемента в коллекции заголовков с ключом Location.
Элемент создается, но мой прокси WCF вызывает следующую ошибку:
Unexpected end of file
Я начал по пути создания собственного IClientMessageFormatter, но:
IClientMessageFormatter.DeserializeReply(Message message, object[] parameters)
до сих пор вызывают до поздна. Я предполагаю, что для того, чтобы перехватить responseStream до того, как он будет прочитан, мне нужно подключиться глубже в классе Behavior.
Любая помощь будет оценена.
Редакция 1.
HTTP/1.1 201 Created
Server: nginx/1.0.5
Date: Thu, 13 Oct 2011 23:52:34 GMT
Content-Type: application/xml; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Status: 201 Created
X-Throttle-Max: 500
X-Throttle-Count: 1
Location: https://sample.com/categories/1.xml
X-Throttle-Horizon: 2011-10-13T23:52:40Z
X-Runtime: 232
Set-Cookie: transition_token=BAhbB2kD8bSUSXU6CVRpbWUNwOUbwAkZIdIGOh9AbWFyc2hhbF93aXRoX3V0Y19jb2VyY2lvblQ%3D--de2dc7f909ce89e0ce9f2307ac43ddfc171442b7; path=/; secure
Set-Cookie: _sample_session=BAh7BzoQaWRlbnRpdHlfaWRpA2eiKjoPc2Vzc2lvbl9pZCIlNGVlNWMzNWY4MzdmZmM3MGNlNzE1ZjdjZmM5MDhmYmY%3D--d8927e076329846e844f9f73b4d587c697628481; path=/; HttpOnly; secure
Cache-Control: no-cache
Strict-Transport-Security: max-age=31536000
1
0
Выше ответ. Он не имеет ни тела, ни содержимого-типа = application/xml. WCF по какой-то причине не знает, как это согласовать. Вот почему я пытаюсь перехватить привязку или поведение WCF перед чтением responseStream.
Я хотел бы видеть, может ли кто-то указать мне правильное направление. Благодарю.
1 ответ
Догадаться. Мне пришлось создать WebContentTypeMapper и назначить его для WebMessageEncodingBindingElement.ContentTypeMapper. Единственная проблема, с которой я столкнулся, заключалась в том, что TypeMapper зависел не только от contentType, но и от ReturnType метода. Ниже приведен пример:
internal class RestWebContentTypeMapper : WebContentTypeMapper
{
public RestWebContentTypeMapper() : base() { }
public override WebContentFormat GetMessageFormatForContentType(string contentType)
{
var type = this.ReturnType;
if (type.FullName == "System.Void" || type.FullName == "RootName.Client.NewEntity")
return WebContentFormat.Raw;
else
return WebContentFormat.Xml;
}
public Type ReturnType { get; set; }
}
Поэтому мне пришлось передавать экземпляр RestWebContentTypeMapper вместе с OperationDescription, пока он не достиг моего пользовательского IClientMessageFormatter. Следующий код был добавлен в SerializeRequest для передачи ReturnType.
public Message SerializeRequest(MessageVersion messageVersion, object[] parameters)
{
this.Mapper.ReturnType = this.Description.SyncMethod.ReturnType;
return Original.SerializeRequest(messageVersion, parameters);
}
Следующий рабочий код скоро будет опубликован по адресу: http://dotnet37signals.codeplex.com/.
Я знаю, что теперь один ответил, но я надеюсь, что это поможет кому-то еще.