Rub*_*aus 0 c# wcf deserialization
我实现了一个自定义消息检查器(通过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;
}
Run Code Online (Sandbox Code Playgroud)
这是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);
}
Run Code Online (Sandbox Code Playgroud)
有什么建议或者有更好的选择吗?我的主要目标是在进入我的服务的每个WCF请求中读取XML(在反序列化的对象中).
请求对象包含WCF消息头以及有效负载.您需要剥离标题,然后您应该能够反序列化邮件正文.
例如,SOAP消息将具有:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
</soap:Header>
<soap:Body>
<!-- your payload -->
</soap:Body>
Run Code Online (Sandbox Code Playgroud)
您可以使用XML导航来获取body元素,然后单独反序列化该元素.
编辑:其实只是偶然发现了这个方法,我觉得应该为你做的伎俩:
Message.GetReaderAtBodyContents