Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证消息正文时出错_C#_Wcf - Fatal编程技术网

C# 验证消息正文时出错

C# 验证消息正文时出错,c#,wcf,C#,Wcf,我正在尝试验证wc消息的正文并获取异常 “对'ValidateDelete'方法的调用与对'ValidateElement'方法的相应调用不匹配。” XmlSchemaSet和读取器设置在单独的方法中加载 xmlReaderSettings = new XmlReaderSettings { ValidationType = ValidationType.Schema, Schemas = this

我正在尝试验证wc消息的正文并获取异常

“对'ValidateDelete'方法的调用与对'ValidateElement'方法的相应调用不匹配。”

XmlSchemaSet和读取器设置在单独的方法中加载

        xmlReaderSettings = new XmlReaderSettings
           {
               ValidationType = ValidationType.Schema,
               Schemas = this.xmlSchemaSet,
               ConformanceLevel = ConformanceLevel.Auto
           };

        xmlReaderSettings.ValidationEventHandler += (o, e) =>
        {
            if (e.Severity == XmlSeverityType.Error)
                throw new ContractXmlSchemaValidationException(e.Message);
        };
创建wcf消息(其中messageBody变量保存正文xml)


当您调用GetReaderAtBodyContents()时,它将执行以下操作:从正文内容开始,为整个消息获取一个读取器。当您到达正文内容的末尾时,xreader.Read()将继续阅读消息的其余部分,并点击正文的结束标记。您需要修改while循环以阻止读卡器点击此项。试试这个:

int startDepth = xreader.Depth;

while (xreader.Read())
{
    if (xreader.Depth == startDepth && xreader.NodeType == XmlNodeType.EndElement)
    {
        break;
    }
}

如果有更优雅的方法,请分享

只需使用:
GetReaderAtBodyContents().ReadSubtree()
你会得到一个阅读器,它只读取身体

编辑:

我用它来验证我的请求。 因为我们令人敬畏的WebSphere只发送一个“HTTP 500内部服务器错误”——如果xml无效,则发送一个错误

var settings = new XmlReaderSettings();

settings.Schemas.Add(_schemas);
settings.CloseInput = true;
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags = XmlSchemaValidationFlags.AllowXmlAttributes
                         | XmlSchemaValidationFlags.ProcessInlineSchema
                         | XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += ValidationEventHandler;


using (XmlDictionaryReader bodyReader = message.GetReaderAtBodyContents())
using (XmlReader documentReader = XmlReader.Create(bodyReader.ReadSubtree(), settings))
{
    documentReader.MoveToContent();

    using (var memory = new MemoryStream())
    //copy & validate in one step :)    
    using (XmlWriter writer = XmlWriter.Create(memory))
    {
        writer.WriteNode(documentReader, false);
        writer.Flush();
    }
#if DEBUG    
    memory.Seek(0, SeekOrigin.Begin);
    string xml = new StreamReader(memory).ReadToEnd();
#endif
    memory.Seek(0, SeekOrigin.Begin);

    message = Message.CreateMessage(message.Version, null, XmlReader.Create(memory));
    message.Headers.CopyHeadersFrom(message);
}

在他们的回答中,@masty错过了带有自动关闭标签的案例。应该是:

int startDepth = xreader.Depth;                    
while (xreader.Read())
{                       
  if (xreader.Depth == startDepth && (xreader.IsEmptyElement || xreader.NodeType == XmlNodeType.EndElement))
   {
      break;
   }
}

您有示例消息吗?更新了代码以创建消息,基本上是任何具有有效模式的xmlelement,以进行验证
var settings = new XmlReaderSettings();

settings.Schemas.Add(_schemas);
settings.CloseInput = true;
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags = XmlSchemaValidationFlags.AllowXmlAttributes
                         | XmlSchemaValidationFlags.ProcessInlineSchema
                         | XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += ValidationEventHandler;


using (XmlDictionaryReader bodyReader = message.GetReaderAtBodyContents())
using (XmlReader documentReader = XmlReader.Create(bodyReader.ReadSubtree(), settings))
{
    documentReader.MoveToContent();

    using (var memory = new MemoryStream())
    //copy & validate in one step :)    
    using (XmlWriter writer = XmlWriter.Create(memory))
    {
        writer.WriteNode(documentReader, false);
        writer.Flush();
    }
#if DEBUG    
    memory.Seek(0, SeekOrigin.Begin);
    string xml = new StreamReader(memory).ReadToEnd();
#endif
    memory.Seek(0, SeekOrigin.Begin);

    message = Message.CreateMessage(message.Version, null, XmlReader.Create(memory));
    message.Headers.CopyHeadersFrom(message);
}
int startDepth = xreader.Depth;                    
while (xreader.Read())
{                       
  if (xreader.Depth == startDepth && (xreader.IsEmptyElement || xreader.NodeType == XmlNodeType.EndElement))
   {
      break;
   }
}