我需要将XML作为字符串发送到我使用ASP.Net.开发的Web服务
为此,我对需要作为webserivce的参数(字符串)发送的xml进行编码,然后在webservice业务逻辑中对其进行解码。
网络服务例如:
[WebMethod]
public void WebService_DoWork ( string xml )
{
try
{
MyBo bo = new MyBo ( HttpUtility.HtmlDecode ( xml ) ) ;
bo.DoWork() ;
}
catch ( Exception err )
{
//Logging Here
}
}
C#客户端例如:
public void CallMethod ()
{
string encodedXMLPayload = @"<?xml version=".." ;
WebService client = new WebService () ;
client.Url = @"http:\myTestServer:portWebService.asmx" ;
client.WebService_DoWork ( encodedXMLPayload ) ;
}
这里是完整的编码XMLPayload数据:
<?xml version="1.0" encoding="utf-8"?>
<RawTransactionsByAllocCode>
<ReportData>
<Costcenter>849001</Costcenter>
<TransactionID>261246195</TransactionID>
<TimeStamp>28/01/2016 10:15:39 PM</TimeStamp>
<TransType>Take</TransType>
<ProductName>Test Product</ProductName>
<SuppliersPartNo>52796843</SuppliersPartNo>
<Quantity>5</Quantity>
<MaterialNumber>17096239</MaterialNumber>
<DeliveryNoteNumber></DeliveryNoteNumber>
<PurchaseOrderReference />
</ReportData>
</RawTransactionsByAllocCode>
如果我试图从我的C#客户端调用我的webservice(webmethodWebService_DoWork),我会收到我发送的确切负载(仍然编码),一切都是正确的。
如果我尝试Postman、SoapUI或其他客户端,当我在webmethod中接收到一个刚刚解码的有效负载时,我会得到它(而配音解码可能会有问题)。
以下是我与SoapUI或Postman:一起使用的soap请求的示例
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:WebService_DoWork>
<tem:xml>
<?xml version="1.0" encoding="utf-8"?>
<RawTransactionsByAllocCode>
<ReportData>
<Costcenter>849001</Costcenter>
<TransactionID>261246195</TransactionID>
<TimeStamp>28/01/2016 10:15:39 PM</TimeStamp>
<TransType>Take</TransType>
<ProductName>Test Product</ProductName>
<SuppliersPartNo>52796843</SuppliersPartNo>
<Quantity>5</Quantity>
<MaterialNumber>17096239</MaterialNumber>
<DeliveryNoteNumber></DeliveryNoteNumber>
<PurchaseOrderReference />
</ReportData>
</RawTransactionsByAllocCode>
</tem:xml>
</tem:WebService_DoWork>
</soapenv:Body>
</soapenv:Envelope>
所以我想知道为什么会出现这种奇怪的行为,可能是C#客户端(在引擎盖下)再次对其进行编码,因为ASP.Net自动对其进行解码?
XML标记不会被编码。只需要对XML标记之间的文本进行编码。使用实际大于和小于符号<
>
和引号"
。在编写XML标记时。您只需要像这样对XML标记的"值"进行编码。
<?xml version="1.0" encoding="utf-8"?>
<RootElement>
<ChildElement>
I need to encode quotes "e; and less than/greater than symbols < > because this is not in a tag
</ChildElement>
<ChildElement>
<DeeperChildElement some-attribute="these quotes aren't encoded">
Special Characters here need to be encoded
</DeeperChildElement>
</ChildElement>
</RootElement>