【问题标题】:ASP.Net WebService automatic Encoding-DecodingASP.Net WebService 自动编码-解码
【发布时间】:2016-05-18 17:14:58
【问题描述】:

我需要将 XML 作为字符串发送到我使用 ASP.Net 开发的 Web 服务。

为此,我将需要发送的 xml 编码为 web 服务的参数(字符串),然后在 web 服务业务逻辑中将其解码。



网络服务例如:

    [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:port\WebService.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# 客户端调用我的 web 服务(webmethod WebService_DoWork),我会收到我发送的确切有效负载(仍然编码)并且一切正常。

如果我尝试使用 Postman、SoapUI 或其他客户端,我会得到一个在 webmethod 中接收时刚刚解码的有效负载(并且双重解码可能有问题)。

这是我与 SoapUI 或 Postman 一起使用的肥皂请求示例:

<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 会自动对其进行解码?

【问题讨论】:

    标签: c# asp.net web-services soap


    【解决方案1】:

    XML 标签不会被编码。只有 XML 标记之间的文本需要编码。使用实际的大于和小于符号&lt;&gt; 和引号"。当您编写 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>
    

    【讨论】:

    • AFAIK Soap 有效负载需要编码,我所看到的似乎 asp.net webservice 和 Visual Studio 客户端(从 wsdl 生成)自动编码-解码有效负载,所以我的显式解码是多余的跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多