gpt4 book ai didi

c# - 在innerXML 中获取引号以作为“

转载 作者:太空狗 更新时间:2023-10-29 23:42:34 24 4
gpt4 key购买 nike

(警告 - 下面是 xml 和无偿字符编码的邪恶混合。)

短版:
为什么我不能得到我的服务引用调用(c#、.net 3.5、添加到 VS2008 的自动服务引用代码)来正确编码一个应该看起来像这样的参数:(查找 " 位.. .那些是我的祸根。)

(为清楚起见,删除了其他额外的肥皂味位)

<SOAP-ENV:Body><SOAPSDK4:SetCondition xmlns:SOAPSDK4="http://tempuri.org/message/">
<sharedSecret>buggerall</sharedSecret>

<xmlData>&lt;SEARCHINFO_LIST&gt;&lt;SEARCH_INFO action=&quot;add&quot; status=&
quot;3&quot; name=&quot;TestProfile2&quot; mask=&quot;0&quot; campaign_id=&quot;33&quot;
campaign_protected=&quot;N&quot; condition_protected=&quot;N&quot;&gt;&lt;CONDITIONS/&
gt;&lt;EXPRESSIONS/&gt;&lt;/SEARCH_INFO&gt;&lt;/SEARCHINFO_LIST&gt;</xmlData>
</SOAPSDK4:SetCondition></SOAP-ENV:Body>

我设置了参数,拨打了电话……服务返回一条很好的消息,说“NO SOU-- SOAP FOR YOU!”

我在传递给 webservice 的参数字符串中尝试了其他几种格式:
action=\"add\"

这给了我这个(通过 fiddler ): action="add"
action=&quot;add&quot;

这给了我这个在线: action=&amp;quot;add&amp;quot;
和各种组合 (action=""add""?! ) 与 html.encode, url.encode 几乎要么完全轰炸,要么在线上显示为双引号。

哦,我什至试过 <![CDATA[&quot;]]周围。那也没有用。

有没有办法在soap消息的innerHtml位中强制使用双引号编码?

*(因为这就是服务想要他们的方式。不要问问题。这些不是你要找的机器人)

*
*
*
冗长曲折的版本:

我正在编写一个应用程序来自动化目前由以下人员处理的一些程序
一个(winform)管理GUI应用程序。 (实际上,这是一个 mmc 管理单元。
反正。)

为了完成它的任务,winform 应用程序通过以下方式与其服务器通信
标准的 Web 服务调用。

我正在使用 VS2008 的漂亮的“Web 服务引用”自动生成工具
(这是技术说明),并且我已成功通过身份验证
网络服务。为了确保我做的事情正确,我捕捉到了
来自 GUI 应用程序的调用,然后将它们与我发送的内容进行比较
电线。一切都很好。然后我遇到了&符号的邪恶。 (更多的
正确地,如何使事物正确编码)

对于其中一个调用,Web 服务希望看到如下内容:
(我捕获了通过 fiddler 发送这个的应用程序)
<?xml version="1.0" encoding="UTF-8" standalone="no"?><SOAP-ENV:Envelope
xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" xmlns:SOAPSDK2="
http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3="
http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="
http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAPSDK4:SetCondition
xmlns:SOAPSDK4="http://tempuri.org/message/"><sharedSecret>0500001007C3525F3-F315-460D-
AF5C-D84767130126094</sharedSecret><xmlData>&lt;SEARCHINFO_LIST&gt;&lt;SEARCH_INFO
action=&quot;add&quot; status=&quot;3&quot; name=&quot;TestProfile2&quot; mask=&
quot;0&quot; campaign_id=&quot;33&quot;campaign_protected=&quot;N&quot;
condition_protected=&quot;N&quot;&gt;&lt;CONDITIONS/&gt;&lt;EXPRESSIONS/&gt;&
lt;/SEARCH_INFO&gt;&lt;/SEARCHINFO_LIST&gt;</xmlData></SOAPSDK4:SetCondition></SOAP-
ENV:Body></SOAP-ENV:Envelope>

去除所有额外的 SOAP-y 内容以显示相关位 - 这是 <xmlData>穿过的部分。请注意 &quot;围绕参数:
&lt;SEARCHINFO_LIST&gt;&lt;SEARCH_INFO action=&quot;add&quot;
status=&quot;3&quot; name=&quot;TestProfile2&quot; mask=&quot;0&quot;
campaign_id=&quot;33&quot; campaign_protected=&quot;N&quot;
condition_protected=&quot;N&quot;&gt;&lt;CONDITIONS/&gt;&lt;EXPRESSIONS/&gt;&
lt;/SEARCH_INFO&gt;&lt;/SEARCHINFO_LIST&gt;

在我的代码中,我有一个像这样构建的字符串:
var serviceParams = "<SEARCHINFO-LIST><SEARCH_INFO action=\"add\"
status=\"3\" name=\"TestProfileFromExternApp\" mask=\"0\" campaign_id=\"33\"
campaign_protected=\"N\"
condition_protected=\"N\"><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";

当我的应用程序通过网络发送它时, fiddler 捕获了这个:(再次,
去除所有 SOAP 的东西)
&lt;SEARCHINFO-LIST&gt;&lt;SEARCH_INFO action="add" status="3"
name="TestProfileFromExternApp" mask="0" campaign_id="33"
campaign_protected="N" condition_protected="N"&gt;&lt;CONDITIONS/&gt;
&lt;EXPRESSIONS/&gt;&lt;/SEARCH_INFO&gt;&lt;/SEARCHINFO_LIST&gt;

并且接收服务发回一个它不喜欢的错误。它想要 &quot; d##尼特。

尖括号得到正确编码,但引号在
HTTP 字符串,并且不会被编码。

“啊哈!”我说,“我只会预先手动编码东西!”。我试图
做这样的事情:
var serviceParams = "<SEARCHINFO-LIST><SEARCH_INFO action=&quot;add&quot;
status=&quot;3&quot; name=&quot;TestProfileFromExternApp&quot;
mask=&quot;0&quot; campaign_id=&quot;33&quot;
campaign_protected=&quot;N&quot;
condition_protected=&quot;N&quot;><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";

这是作为(再次,通过 fiddle 手)和我所有的&符号(在 &quot; ) 转换为 &amp;quot;像这样:
&lt;SEARCHINFO-LIST&gt;&lt;SEARCH_INFO action=&amp;quot;add&amp;quot;
status=&amp;quot;3&amp;quot;
name=&amp;quot;TestProfileFromExternApp&amp;quot; mask=&amp;quot;0&amp;quot;
campaign_id=&amp;quot;33&amp;quot; campaign_protected=&amp;quot;N&amp;quot;
condition_protected=&amp;quot;N&amp;quot;&gt;&lt;CONDITIONS/&gt;&lt;EXPRESSIONS/&gt;&lt;/SEARCH_INFO&gt;&lt;/SEARCHINFO_LIST&gt;

而且,正如您所猜测的,接收 Web 服务返回“BZZT!
谢谢你来玩!”。

我尝试了各种转义和编码序列,结果相似。
实际上,在我的所有操作之后,它经历了类似的事情
HttpUtility.HtmlEncode 在上线之前,以及任何
字符串中的 & 符号被转换为 &amp; .和引号(单个或
double) 在转换中被忽略。和接收网络服务
希望那些引号表示为 &quot;坚持下去,或者它会
拿球回家。

我最后一个绝望的希望是在使用 IClientMessageInspector to implement message inspection 发送到网络之前正确地捕获消息(我认为)。在 BeforeSendRequest 事件中......并在它进入线路之前手动设置这些东西。

我很好地捕获了消息。我什至可以手动输入 &quot; .

但是当它被发送时,wireshark 和 fiddler 都向我保证它的格式很好……我非常想摆脱引号。
<xmlData xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
&lt;SEARCHINFO-LIST&gt;&lt;SEARCH_INFO action="add" status="3"
name="TestProfileFromExternApp" mask="0" campaign_id="33" campaign_protected="N"
condition_protected="N"&gt;&lt;CONDITIONS/&gt;&lt;EXPRESSIONS/&gt;
&lt;/SEARCH_INFO&gt;&lt;/SEARCHINFO_LIST&gt;</xmlData>

我在我的智慧尽头。我会接受任何建议,包括牺牲 【小萌物】 上【邪神】或卖同样的我的 【魂/心/子生化合集】 .相信我,它会是较小的邪恶。

根据下面的请求,这是生成的消息 stub :
(我想这就是你要的......)
public int SetCondition(string sharedSecret, string xmlData, out string resultValue) 
{
tzGui.tzCampaign.SetConditionRequest inValue = new tzGui.tzCampaign.SetConditionRequest();
inValue.sharedSecret = sharedSecret;
inValue.xmlData = xmlData;
tzGui.tzCampaign.SetConditionResponse retVal = ((tzGui.tzCampaign.CampaignSoapPort)(this)).SetCondition(inValue);
resultValue = retVal.resultValue;
return retVal.Result;
}

这是它的调用方式:
void SetConditionTask()
{
//ok, now we *try* and create a new profile
var tzCampaignCxn = new tzCampaign.CampaignSoapPortClient("CampaignSoapBinding");
//no worky
//string xmlData = "<SEARCHINFO-LIST><SEARCH_INFO action=\"add\" status=\"3\" name=\"TestProfileFromExternApp\" mask=\"0\" campaign_id=\"33\" campaign_protected=\"N\" condition_protected=\"N\"><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";

//this one doesn't work
//string xmlData = "<SEARCHINFO-LIST><SEARCH_INFO action=<![CDATA[ &quot; ]]>add<![CDATA[ &quot; ]]> status=<![CDATA[ &quot; ]]>3<![CDATA[ &quot; ]]> name=<![CDATA[ &quot; ]]>TestProfileFromExternApp<![CDATA[ &quot; ]]> mask=<![CDATA[ &quot; ]]>0<![CDATA[ &quot; ]]> campaign_id=<![CDATA[ &quot; ]]>33<![CDATA[ &quot; ]]> campaign_protected=<![CDATA[ &quot; ]]>N<![CDATA[ &quot; ]]> condition_protected=<![CDATA[ &quot; ]]>N<![CDATA[ &quot; ]]>><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";

//this one doesn't either
string xmlData = "<SEARCHINFO-LIST><SEARCH_INFO action=&quot;add&quot; status=&quot;3&quot; name=&quot;TestProfileFromExternApp&quot; mask=&quot;0&quot; campaign_id=&quot;33&quot; campaign_protected=&quot;N&quot; condition_protected=&quot;N&quot;><CONDITIONS/><EXPRESSIONS/></SEARCH_INFO></SEARCHINFO_LIST>";

string createProfileResultVal = string.Empty;
tzCampaignCxn.SetCondition(SharedSecret, xmlData, out createProfileResultVal);
txtResults.AppendText(Environment.NewLine + Environment.NewLine + createProfileResultVal);
}

最佳答案

如果我理解您的长篇文章,您似乎是在使用字符串构建 XML 的一部分。不要那样做。始终使用 XML API 之一来创建 XML。它知道引用规则。

关于c# - 在innerXML 中获取引号以作为“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2136544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com