(IDispatchMessageInspectorを介して)カスタムメッセージインスペクターを実装して、WCFサービスのサーバー側で受信したメッセージをインターセプトし、メッセージの逆シリアル化と特定のビジネスロジックの適用を試みることができるようにしました。私が遭遇している問題は、MessageBufferの内容を新しいMemoryStreamに書き込んでから逆シリアル化しようとすると、「ルートレベルのデータが無効です。1行目、1行目」というエラーが表示されることです。インスペクターをスキップするとすべてが正常に機能するため、渡されるデータが有効であることを私は知っています。
サンプルコード:
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
request = buffer.CreateMessage();
string msg = buffer.CreateMessage().ToString();
var dc = new DataContractSerializer(typeof(Adder));
using (var stream = new MemoryStream())
{
buffer.WriteMessage(stream);
stream.Position = 0;
//deserializing error occurs here
var c = dc.ReadObject(stream);
}
return null;
}
Adderクラス/インターフェースは次のとおりです。
[DataContract(Name = "adder", Namespace = "http://test.com")]
public class Adder
{
[DataMember(Name = "first")]
public int First { get; set; }
[DataMember(Name = "second")]
public int Second { get; set; }
}
[ServiceContract(Namespace = "http://test.com")]
public interface ITestSvc
{
[OperationContract(Name = "add")]
int Add(Adder adder);
}
何か提案がありますか、またはこれのためのより良いオプションがありますか?私の主な目標は、サービスに着信するすべてのWCF要求でXMLを(逆シリアル化されたオブジェクトで)読み取ることです。