0

固定仕様に対して汎用のClientBase基本クラスを使用してWCFPOXプロキシを作成しています。

仕様には、エンドポイントへのPOST呼び出しで作成されたアイテムがあります。ボディ応答パケットがなく、ヘッダーステータスが(201 Created)で、ヘッダーコレクション内のアイテムのIDと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; }
}

したがって、カスタム IClientMessageFormatter に到達するまで、RestWebContentTypeMapper インスタンスを OperationDescription と共に渡す必要がありました。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に投稿されます。

1人が回答したことはわかっていますが、これが他の人の助けになることを願っています。

于 2011-10-14T15:42:41.013 に答える