ASP.Net WebService自动编码解码



我需要将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=&quot.." ;
    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>
                 &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
                     &lt;RawTransactionsByAllocCode&gt;
                         &lt;ReportData&gt;
                             &lt;Costcenter&gt;849001&lt;/Costcenter&gt;
                             &lt;TransactionID&gt;261246195&lt;/TransactionID&gt;
                             &lt;TimeStamp&gt;28/01/2016 10:15:39 PM&lt;/TimeStamp&gt;
                             &lt;TransType&gt;Take&lt;/TransType&gt;
                             &lt;ProductName&gt;Test Product&lt;/ProductName&gt;
                             &lt;SuppliersPartNo&gt;52796843&lt;/SuppliersPartNo&gt;
                             &lt;Quantity&gt;5&lt;/Quantity&gt;
                             &lt;MaterialNumber&gt;17096239&lt;/MaterialNumber&gt;
                             &lt;DeliveryNoteNumber&gt;&lt;/DeliveryNoteNumber&gt;
                             &lt;PurchaseOrderReference /&gt;
                         &lt;/ReportData&gt;
                     &lt;/RawTransactionsByAllocCode&gt;
             </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 &quote; and less than/greater than symbols &lt; &gt; 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>