这次做了一个关于socket方式的税控接口,让人伤心的是,他们的接口文档总是不成熟,各种各样的错。
先说说需要注意的地方。
第一:关于socket传送的xml字符串时候应该注意的格式。要不然中文会乱码。
/// <summary>
/// 发送XML数据
/// </summary>
/// <param name="xml"></param>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <returns>发送XML数据结果</returns>
public string SocketGetXML(string xml, string ip, string port)
{
byte[] result = new byte[1024];
IPAddress ipAdress = IPAddress.Parse(ip);
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(new IPEndPoint(ipAdress, Convert.ToInt32(port)));
clientSocket.Send(Encoding.GetEncoding("GB2312").GetBytes(xml));
Thread.Sleep(1000);
int receiveLength = clientSocket.Receive(result);
clientSocket.Close();
return Encoding.GetEncoding("GB2312").GetString(result, 0, receiveLength);
}
第二:关于模态化窗口传递中文参数应该注意的问题
在前台js:
var message = window.showModalDialog("InvoiceCharge.aspx?Kpr=" + encodeURI(encodeURI(Kpr)) + "&Je=" + Je + "&InvoVersion=" + InvoVersion + "&InvoNumber=" + fph, "", "dialogHeight:100px;dialogWidth:200px;status:no;center:yes;");
后台C#处理时候:
string Kpr = HttpUtility.UrlDecode(Request["Kpr"]);
string Je = Request["Je"];
string InvoVersion = Request["InvoVersion"];
string InvoNumber = Request["InvoNumber"];
但是如果传递的参数中包含了—号或者%号等一些特别的符号,这时造成无法解析。可以在前台用encodeURIComponent(parameters)转化就行了。
第三:关于模态化窗体的取值:
可以在C#后台,将需要传递的值传递给一个隐藏域,
同时在页面前台用用js获取他的值,但是这个js必须放在body的onload中加载。如:
<script language="javascript" type="text/javascript">
function onload() {
var messsage = document.getElementById("HiddenField2").value;
window.returnValue = messsage;
window.close();
}
</script>
</head>
<body onload="onload();">
第四:关于js解析xml字符串的问题。
首先要把xml字符串转化为xml对象。然后解析
//字符串转化为xml对象
function toXmlDom(source) {
var xmlDoc = null;
if (window.ActiveXObject) {
var ARR_ACTIVEX = ["MSXML4.DOMDocument", "MSXML3.DOMDocument", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XmlDom"];
var XmlDomflag = false;
for (var i = 0; i < ARR_ACTIVEX.length && !XmlDomflag; i++) {
try {
var objXML = new ActiveXObject(ARR_ACTIVEX[i]);
xmlDoc = objXML; XmlDomflag = true;
} catch (e) { }
} if (xmlDoc) {
xmlDoc.async = false;
xmlDoc.loadXML(source);
}
} else {
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(source, "text/xml");
}
return xmlDoc;
}
这是一个适合各种浏览器的转化方法,兼容了IE和火狐。
然后:
function getAttributeValue(xmlNode, attrName) {
if (!xmlNode) return "";
if (!xmlNode.attributes) return "";
if (xmlNode.attributes[attrName] != null)
return xmlNode.attributes[attrName].value;
if (xmlNode.attributes.getNamedItem(attrName) != null)
return xmlNode.attributes.getNamedItem(attrName).value; return "";
}
这是获取相应节点中的属性值。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(aryBill[i]);
var Je = (getAttributeValue(xmlDoc.getElementsByTagName("ITEM")[0].childNodes[55], "VALUE")).split(':')[1].toString();
var Kpr = (getAttributeValue(xmlDoc.getElementsByTagName("ITEM")[0].childNodes[70], "VALUE")).split(' ')[0].toString();
var fpbbh = InvoVersion;
var fph = getAttributeValue(xmlDoc.getElementsByTagName("ITEM")[0].childNodes[95], "VALUE");
这是如何获取其中的值。