Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.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/2/csharp/306.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
Javascript 基于密钥将数组中的值插入SOAP消息_Javascript_C#_Asp.net_Web Services_Soap - Fatal编程技术网

Javascript 基于密钥将数组中的值插入SOAP消息

Javascript 基于密钥将数组中的值插入SOAP消息,javascript,c#,asp.net,web-services,soap,Javascript,C#,Asp.net,Web Services,Soap,在一个ASP.NET应用程序中,用户(“用户A”)可以使用SOAP建立自己的web服务连接,我允许他们插入自己的信封,例如,可以是以下内容: //Formatted for Clarity string soapMessage = "<soap: Envelope //StandardStuff> <soap:Header //StandardStuff> <wsse:UsernameToken> <wsse: Username

在一个ASP.NET应用程序中,用户(“用户A”)可以使用SOAP建立自己的web服务连接,我允许他们插入自己的信封,例如,可以是以下内容:

//Formatted for Clarity
string soapMessage = 
"<soap: Envelope //StandardStuff>
  <soap:Header //StandardStuff>
    <wsse:UsernameToken>
      <wsse: Username>{F1}</wsse:Username>
      <wsse: Password Type''>{F2}</wsse:Password>  
    </wsse:UsernameToken>
  </soap:Header>
  <soap:Body>
    <ref:GetStuff>
      <ref:IsActive>{F3}</ref:IsActive>
    </ref:GetStuff>
  </soap:Body>
</soap:Envelope>"
此数组在反序列化之前作为字符串进入fray(
dynamic JsonObject=JsonConvert.DeserializeObject(stringifiedJson);

现在,我希望能够在信封中插入相应的值,最好具有一定程度的安全性,不允许人们通过在数组中插入奇怪的值来做奇怪的事情(正则表达式可能是我最后的选择)

到目前为止,我知道这样构建字符串的概念(soap消息中的
{}
{0}、{1}&{2}
替换):


但是这个数组中的值的数量以及引用的顺序可能会随着用户的输入以及引用的顺序的变化而变化,所以我需要更灵活的方法。我对进行SOAP调用非常陌生,因此希望能提供尽可能简单的答案。

考虑创建一个函数,用占位符各自的值替换占位符

private string FormatMessage(string soapMessage, IDictionary<string, string> parameters) {
    var message = soapMessage;
    foreach (var kvp in parameters) {
        var placeholder = "{" + kvp.Key + "}";
        if (message.IndexOf(placeholder) > -1) {
            message = message.Replace(placeholder, kvp.Value);
        }
    }
    return message;
}
私有字符串格式消息(字符串soapMessage,IDictionary参数){
var消息=soapMessage;
foreach(参数中的var kvp){
变量占位符=“{”+kvp.Key+“}”;
if(message.IndexOf(占位符)>-1){
message=message.Replace(占位符,kvp.Value);
}
}
返回消息;
}
其中字典是从提供给函数的JSON中提取的

var parameters = JsonConvert.DeserializeObject<IDictionary<string, string>>(json);

string body = FormatMessage(soapMessage, parameters);
var parameters=JsonConvert.DeserializeObject(json);
字符串体=FormatMessage(soapMessage,参数);

但是,您需要验证提供的值和键,以避免可能对系统产生不利影响的注入。

使用xml处理器而不是字符串替换来处理xml始终是一个好主意。 我交叉思考的想法可能不完全适合你的用例,我必须承认,我没有100%地理解你的大局

无论如何,我的答案是,您可以使用XPath作为键,这将使您能够在后端使用xml处理工具。此时不必验证任何内容,这取决于体系结构

在我看来,javascript提供了以下结构:

[
  { 
    key: "//family-name", 
    value: "Michael" 
  },
  { 
    key: "//nickname", 
    value: "Jackson" 
  }
];
以及后端:

XmlElement foo = (XmlElement)doc.SelectSingleNode(key);
foo.InnerText = value;

这项工作的最佳工具IMHO是XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:crs="CRS610MI" exclude-result-prefixes="crs">
<xsl:output method="xml"/>
<xsl:template match="/">
  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <soap:Body>
    <xsl:apply-templates select="node()|@*"/>
    </soap:Body>
  </soap:Envelope>
</xsl:template>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>
在.NET中加载XSLT模板非常简单:

var xml = XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(
Encoding.ASCII.GetBytes(jsonString), new XmlDictionaryReaderQuotas()));

这是一种干净、专业的方法,我相信符合您的标准。

您是否评估过任何现有的模板引擎,如
nustache
()或
handlebar.net
()?我没有评估过,因为我无权在此项目中添加新库。作为这样一个不需要这些的选项,您会有偏好。您对如何验证这些值有什么建议吗?问题在于,这涉及到一个用户提供消息供另一个用户填写,因此事先不知道此消息或值可能包含哪些内容。@Patrick,这些是转换消息之前需要处理的实现问题。如果您控制着代码,那么在尝试转换消息之前,您始终可以验证提供的值是否与当前用户匹配。其思想是soap消息由用户A提供,值由用户B提供,因此让用户A在xml选择器中思考可能会很复杂,但我绝对喜欢你的开箱即用的想法。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:crs="CRS610MI" exclude-result-prefixes="crs">
<xsl:output method="xml"/>
<xsl:template match="/">
  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <soap:Body>
    <xsl:apply-templates select="node()|@*"/>
    </soap:Body>
  </soap:Envelope>
</xsl:template>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

// To convert JSON text contained in string json into an XML node
XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
var xml = XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(
Encoding.ASCII.GetBytes(jsonString), new XmlDictionaryReaderQuotas()));