WebService SOAP编码UTF-16而不是UTF-8

时间:2015-10-07 12:48:42

标签: c# web-services asp.net-mvc-4 encoding

是否可以强制C#.NET中的WebService使用UTF-16编码而不是UTF-8?

我创建了一个接收XML文档的简单WebService。

WebService.asmx

public class WebApplication1 : WebService
{
    [WebMethod(Description = "Test")]
    public string Test(XmlDocument xmlDocument)
    {
        return "Test";
    }
}

输出

POST /WebService.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/Test"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <Test xmlns="http://tempuri.org/">
      <xmlDocument>xml</xmlDocument>
    </Test>
  </soap:Body>
</soap:Envelope>

如果我尝试传递UTF-16编码的XML文档,我会收到以下错误:

XML Content:
<?xml version="1.0" encoding="utf-16"?> <Affiliate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" leadinnumber="ABCDABCD" xmlns:xsd="http://www.w3.org/2001/XMLSchema" mediaid="30000">
  <Details>
    <Amount>5000</Amount>
    <FirstName>Delivery</FirstName>
    <Surname>Testing</Surname>
    <Tel>02034056978</Tel>
    <Email>adfsdfsdfsd@live.co.uk</Email>
  </Details>
</Affiliate>

Post Response
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <soap:Fault>
      <soap:Code>
        <soap:Value>soap:Receiver</soap:Value>
      </soap:Code>
      <soap:Reason>
        <soap:Text xml:lang="en">System.Web.Services.Protocols.SoapException: Server was unable to process request. ---&gt; System.Xml.XmlException: There is no Unicode byte order mark. Cannot switch to Unicode. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo(String res) at System.Xml.XmlTextReaderImpl.CheckEncoding(String newEncodingName) at System.Xml.XmlTextReaderImpl.ParseXmlDeclaration(Boolean isTextDecl) at System.Xml.XmlTextReaderImpl.Read() at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.Read() at System.Xml.XmlReader.MoveToContent() at System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.MoveToContent() at System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestElement() at System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest() at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message) at System.Web.Services.Protocols.SoapServerProtocol.Initialize() at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean&amp; abortProcessing) --- End of inner exception stack trace ---</soap:Text>
      </soap:Reason>
      <soap:Detail />
    </soap:Fault>
  </soap:Body>
</soap:Envelope>

非常感谢任何帮助: - )

1 个答案:

答案 0 :(得分:2)

您必须配置您的网络服务。转到Web.config的全球化部分并生成UTF-16而不是UTF-8。全球化标签的requestEncoding和responseEncoding属性应设置为UTF-16。

<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>

必须转换为

<globalization requestEncoding="utf-16" responseEncoding="utf-16"/>

此更改将允许Web服务接受请求并以UTF-16发送响应。

修改

要通过代码手动设置编码,您可以使用以下代码:

        // Set the path of the config file.
        string configPath = "";            
        Configuration config = WebConfigurationManager.OpenWebConfiguration(configPath);
        GlobalizationSection configSection = (GlobalizationSection)config.GetSection("system.web/globalization");            
        configSection.RequestEncoding = Encoding.Unicode;
        configSection.ResponseEncoding = Encoding.Unicode;