基于Key将数组中的值插入到SOAP消息中

Pat*_*ick 5 javascript c# asp.net soap web-services

在用户("用户A")可以使用SOAP建立自己的Web服务连接的ASP.NET应用程序中,我让它们插入自己的信封,例如,这些信封可能是这些内容:

//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>"
Run Code Online (Sandbox Code Playgroud)

同时我是一个发送数据数组的"用户B",从javascript传递给json,看起来像这样:

[
  { 
    key: "F1", 
    value: "A" 
  },
  { 
    key: "F2", 
    value: "B" 
  },
  { 
    key: "F3", 
    value: "C" 
  }
];
Run Code Online (Sandbox Code Playgroud)

在反序列化(dynamic JsonObject = JsonConvert.DeserializeObject(stringifiedJson);)之前,此数组作为字符串输入fray .

现在,我希望能够将相应的值插入到信封中,最好具有一定程度的安全性,不允许人们通过在数组中插入奇怪的值来执行时髦的东西(正则表达式可能是我最后的手段) .

到目前为止,我已经意识到构建字符串的概念({}将肥皂消息中的's替换为{0}, {1} & {2}):

string value1 = "A";
string value2 = "B";
string value3 = "C";
var body = string.Format(@soapMessage, value1, value2, value3);

request.ContentType = "application/soap+xml; charset=utf-8";
request.ContentLength = body.Length;
request.Accept = "text/xml";
request.GetRequestStream().Write(Encoding.UTF8.GetBytes(body), 0, body.Length);
Run Code Online (Sandbox Code Playgroud)

但是这个数组中的值的数量以及可能会根据用户的输入以及引用的移位顺序而改变,所以我需要更灵活的东西.我很擅长拨打SOAP电话,所以尽可能地回答愚蠢的答案.

Nko*_*osi 1

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

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;
}
Run Code Online (Sandbox Code Playgroud)

字典是从提供给函数的 JSON 中提取的。

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

string body = FormatMessage(soapMessage, parameters);
Run Code Online (Sandbox Code Playgroud)

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