创建201并且没有响应内容时WCF REST(POX)客户端出错

时间:2011-10-13 19:42:16

标签: xml wcf rest responsestream

我正在使用针对固定规范的通用ClientBase基类创建WCF POX代理。

规范具有通过对端点的POST调用创建的项目。没有正文响应数据包和标题状态(201 Created)以及标题集合中具有Location键的项目的ID。

正在创建项目,但我的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

以上是回复。它没有body和content-type = application / xml。由于某种原因,WCF不知道如何协调这一点。所以,这就是为什么我在读取responseStream之前试图拦截WCF绑定或行为。

我想看看是否有人可以指出正确的方向。感谢。

1 个答案:

答案 0 :(得分:0)

想出来。我必须创建一个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

我知道现在有人回复了,但我希望这有助于其他人。