我正在尝试使用 ClientMessageInspector 修改来自 Web 服务的响应。在某些时候,我需要从修改后的 XMLStream 创建一个 Message。流的内容如下:
<soapenv:Envelope xmlns:soapenv="http://env" xmlns:xsd="http://xsd" xmlns:xsi="http://xsi" xmlns:v1="http://v1">
<soapenv:Body>
<v1:VM>
<SH>
<a>aa</a>
<b>bb</b>
</SH>
</v1:VM>
</soapenv:Body>
</soapenv:Envelope>
我尝试使用以下方法创建消息:
System.Xml.XmlReader XMLReader = System.Xml.XmlReader.Create(XMLStream);
Message ModifiedReply = System.ServiceModel.Channels.Message.CreateMessage(OriginalReply.Version, null, XMLReader);
但是,当我使用 Message.ToString() 打印消息内容时,我得到:
<s:Envelope xmlns:s="http://env">
<s:Header />
<s:Body>
... stream ...
</s:Body>
</s:Envelope>
如何防止“...stream...”并获取实际的 XML 部分?
最佳答案
从 XmlReader 创建的消息将始终打印出 ...stream... 作为其主体。由于读取器是底层 XML 的只进 View ,它不能被多次使用,所以如果 ToString 从读取器读取数据,则消息将无法使用由 WCF 管道的其余部分(例如编码器,它将其写入线路)。
如果你真的想看到完整的消息,你可以做的是自己缓冲消息,然后再重新创建它。您可以为此使用 MessageBuffer。如果您真的想要完整的消息内容,ToString 可能会也可能不会给您,因此您需要写出消息以强制打印它。
public class StackOverflow_12609525
{
public static void Test()
{
string xml = @"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""
xmlns:xsd=""http://xsd""
xmlns:xsi=""http://xsi""
xmlns:v1=""http://v1"">
<soapenv:Body>
<v1:VM>
<SH>
<a>aa</a>
<b>bb</b>
</SH>
</v1:VM>
</soapenv:Body>
</soapenv:Envelope>";
MemoryStream XmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
XmlReader reader = XmlReader.Create(XmlStream);
Message originalReply = Message.CreateMessage(reader, int.MaxValue, MessageVersion.Soap11);
Console.WriteLine(originalReply); // this shows ...stream...
Console.WriteLine();
XmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
reader = XmlReader.Create(XmlStream);
Message modifiedReply = Message.CreateMessage(reader, int.MaxValue, originalReply.Version);
MessageBuffer buffer = modifiedReply.CreateBufferedCopy(int.MaxValue); // this consumes the message
Message toPrint = buffer.CreateMessage();
MemoryStream ms = new MemoryStream();
XmlWriterSettings ws = new XmlWriterSettings
{
Indent = true,
IndentChars = " ",
OmitXmlDeclaration = true,
Encoding = new UTF8Encoding(false)
};
XmlWriter w = XmlWriter.Create(ms, ws);
toPrint.WriteMessage(w);
w.Flush();
Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
modifiedReply = buffer.CreateMessage(); // need to recreate the message here
}
}
关于xml - 在 WCF 中修改 XML 响应;损坏的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12609525/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1
我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::
我正在遍历数组中的一组标签名称,我想使用构建器打印每个标签名称,而不是求助于“我认为:builder=Nokogiri::XML::Builder.newdo|xml|fortagintagsxml.tag!tag,somevalendend会这样做,但它只是创建名称为“tag”的标签,并将标签变量作为元素的文本值。有人可以帮忙吗?这个看起来应该比较简单,我刚刚在搜索引擎上找不到答案。我可能没有以正确的方式提问。 最佳答案 尝试以下操作。如果我没记错的话,我添加了一个根节点,因为Nokogiri需要一个。builder=Nokogi
这是一些奇怪的例子:#!/usr/bin/rubyrequire'rubygems'require'open-uri'require'nokogiri'print"withoutread:",Nokogiri(open('http://weblog.rubyonrails.org/')).class,"\n"print"withread:",Nokogiri(open('http://weblog.rubyonrails.org/').read).class,"\n"运行此返回:withoutread:Nokogiri::XML::Documentwithread:Nokogiri::
我不是Ruby专家,但想弄清楚发生了什么,因为我试图让指南针在节点应用程序中工作,但我的Ruby似乎坏了。打字:ruby--version让我:ruby2.1.1p76(2014-02-24revision45161)[x86_64-darwin13.0]我安装了Homebrew,之前遇到过Ruby版本的问题,但它似乎已安装并且可以正常工作。但是,当我使用gem输入请求时,出现此错误:$gem-hErrorloadingRubyGemsplugin"/Users/user_dir/.rvm/gems/ruby-2.1.1@global/gems/executable-hooks-1.3
我正在尝试加载SAML协议(protocol)架构(具体来说:https://www.oasis-open.org/committees/download.php/3407/oasis-sstc-saml-schema-protocol-1.1.xsd),但在执行此操作之后:schema=Nokogiri::XML::Schema(File.read('saml11_schema.xsd'))我得到这个输出:Nokogiri::XML::SyntaxErrorException:Element'{http://www.w3.org/2001/XMLSchema}element',att
我试图在我的RubyonRails应用程序中调试一个极其缓慢的请求调用。我已设法根据自己的喜好优化Controller方法,Rails的日志告诉我它已在XX毫秒内完成操作(Completed200OKin5049ms(Views:34.9ms|ActiveRecord:76.3ms)).但是,在加载页面时,在浏览器中实际呈现任何内容之前打印此消息很长;最多约15秒的等待时间。Rackmini-profiler证实了这一点,告诉我GET操作(不计算完成Controller操作所花费的时间)花费了14秒左右。(分析器还确认Controller操作的执行时间约为5秒)。我可以接受Contro