说明:对接接口时对方给了wsdl,为了项目不导入N个wsdl转的cs文件造成项目沉积。
代码如下
//该方法内容为了拼接和使用soapUi请求时一致发送的xml
private StringBuilder GetStringBud(string action, Dictionary<string, string> dicBody)
{
StringBuilder soap = new StringBuilder();
soap.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
soap.Append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:com=\"http://commont\">");
soap.Append("<soapenv:Body>");
soap.Append("<com:" + action + ">");
if (dicBody != null && dicBody.Count > 0)
{
foreach (var item in dicBody)
{
soap.Append("<com:" + item.Key + ">" + item.Value + "</com:" + item.Key + ">");
}
}
soap.Append("</com:" + action + ">");
soap.Append("</soapenv:Body>");
soap.Append("</soapenv:Envelope>");
return soap;
}
//post请求方法,url为解析后的webserver路径,非.wsdl
private saveTemperatureResponse soapPost(string url, string action, Dictionary<string, string> dicBody)
{
string result = "";
Uri uri = new Uri(url);
var soap = GetStringBud(action, dicBody);
System.Net.WebRequest webRequest = System.Net.WebRequest.Create(uri);
webRequest.ContentType = "text/xml; charset=utf-8"; //注意该参数需和调试工具中一致
webRequest.Method = "POST";
webRequest.Headers.Add("SOAPAction", url+"?wsdl");//必须要添加头部信息,Url?wsdl 指完整的wsdl路径。这个地方困扰了一天,没有添加一直报500异常。
using (Stream requestStream = webRequest.GetRequestStream())
{
byte[] paramBytes = Encoding.UTF8.GetBytes(soap.ToString());
requestStream.Write(paramBytes, 0, paramBytes.Length);
}
//响应
WebResponse webResponse = webRequest.GetResponse();
using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(myStreamReader.ReadToEnd());//用xml解析接收的内容
result = xmldoc.InnerText;
saveTemperatureResponse descJsonStu = JsonConvert.DeserializeObject<saveTemperatureResponse>(result);
return descJsonStu;
}
}
private class saveTemperatureResponse
{
public string message { get; set; }
public string statusCode { get; set; }
//public string page { get; set; }
public SaveTemperatureResponseDto data { get; set; }
}
private class SaveTemperatureResponseDto
{
public bool SaveTemperature { get; set; }
}