【发布时间】:2012-10-23 23:41:47
【问题描述】:
我实现了一个自定义消息检查器(通过 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(在反序列化对象中)。
【问题讨论】:
-
你为什么要自己反序列化它?你有什么特别想解决的问题吗?
-
错误消息表明它可能是由于 NameSpace
-
这主要是出于懒惰。我正在使用一个自定义安全主体,该主体将基于每条消息中发送的数据的某些部分。我希望在收到消息时拦截它,设置 ThreadPrincipal 然后所有授权都可以自动工作。总体而言,这比在每个方法调用上手动设置更容易。
-
我过去做过类似的事情,但我总是从消息头中提取凭据,所以实际上并没有尝试在我的消息检查器中反序列化有效负载。
-
我不反对标头,但其中一项主要工作是确保可以从其他客户端发送相同的标头值,例如 Android/iOS 进行调用。假设他们可以,我将转到标题并完成此操作!
标签: c# wcf deserialization