Ошибка с клиентом 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/.

Я знаю, что теперь один ответил, но я надеюсь, что это поможет кому-то еще.

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