Ошибка с клиентом WCF REST (POX) при создании 201 и отсутствии ответа - PullRequest
0 голосов
/ 13 октября 2011

Я создаю прокси 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 Ответ

0 голосов
/ 14 октября 2011

Разобрался.Мне пришлось создать 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.

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

...