0

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

该规范包含通过对端点的 POST 调用创建的项目。没有body响应包,header状态为(201 Created),header集合中item的ID,key为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

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

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

4

1 回答 1

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。为了传递 ReturnType,将以下代码添加到 SerializeRequest。

public Message SerializeRequest(MessageVersion messageVersion, object[] parameters)
{
    this.Mapper.ReturnType = this.Description.SyncMethod.ReturnType;

    return Original.SerializeRequest(messageVersion, parameters);
}

以下工作代码将很快发布到:http ://dotnet37signals.codeplex.com 。

我知道现在有人回应了,但我希望这对其他人有所帮助。

于 2011-10-14T15:42:41.013 回答