我有一个类似于这样的ASP.NET WebService:
一个第三方应用程序应该调用这个Web服务。然而,这个应用程序将字符串编码为UTF-8,并且所有的umlauts都被替换为“??”。我可以查看调用和特殊字符的格式化很好:
在
所以看起来某个反序列化SOAP消息的东西没有使用UTF-8而是ASCII编码。
[WebMethod]
public static void DoSomethingWithStrings(string stringA, string stringB)
{
// and so on
}
一个第三方应用程序应该调用这个Web服务。然而,这个应用程序将字符串编码为UTF-8,并且所有的umlauts都被替换为“??”。我可以查看调用和特殊字符的格式化很好:
<?xml version="1.0" encoding="utf-8" ?>
<!-- ... -->
<SoapCall>
<DoSomethingWithStrings>
<stringA>Ä - Ö - Ü</stringA>
<stringB>This is a test</stringB>
</DoSomethingWithStrings>
</SoapCall>
当我在webservice方法中简单打印字符串时,会产生以下输出:
?? - ?? - ??
这是一个测试
如何配置WebService接受UTF-8编码的字符串?
更新
Fiddler还告诉我,http请求的内容类型字符集为UTF-8。
更新2
我尝试添加以下代码到global.asax
进行调试:
public void Application_BeginRequest(object sender, EventArgs e)
{
using (var reader = new System.IO.StreamReader(Request.InputStream))
{
string str = reader.ReadToEnd();
}
}
这里读取了实际的SOAP调用。 StreamReader
的编码设置为UTF-8。 SOAP调用看起来是正确的:
<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<DoSomethingWithStrings xmlns="http://www.tempuri.org/">
<stringA>Ä - Ö - Ü</stringA>
<stringB>This is a test!</stringB>
</DoSomethingWithStrings>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
在
web.config
文件中,全球化设置已正确设置:<globalization requestEncoding="UTF-8" responseEncoding="UTF-8" culture="de-DE" uiCulture="de-DE" />
所以看起来某个反序列化SOAP消息的东西没有使用UTF-8而是ASCII编码。