我有一个看起来像这样的ASP.NET WebService:
[WebMethod]
public static void DoSomethingWithStrings(string stringA, string stringB)
{
// and so on
}
第三方应用程序应该调用此Web服务。但是,这个应用程序将字符串编码为UTF-8,所有变音符号都被'??'替换。我可以查看该调用,并且特殊字符格式正确:
<?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
s编码设置为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编码。
答案 0 :(得分:4)
最后,事实证明在接受HTTP消息时出现了问题。我实际上并不知道是什么操纵HTTP-Request,但我找到了解决方法。尽管Fiddler在我的text/xml; charset=utf-8
中向我显示了正确的内容类型(Application_BeginRequest
)Request.RequestContext.HttpContext.Request.ContentType
只是text/xml
,这导致ASMX中的默认(ASCII)编码回退串行器。我已将以下代码添加到Application_BeginRequest
处理程序中,现在一切正常。
if (Request.RequestContext.HttpContext.Request.ContentType.Equals("text/xml"))
{
Request.RequestContext.HttpContext.Request.ContentType = "text/xml; charset=UTF-8";
}
感谢您的帮助!
答案 1 :(得分:0)
试试这个: -
byte[] bytes=Encoding.UTF8.GetBytes(yourString);
注意: -
字符串永远不会包含任何utf- *或其他任何编码的内容
答案 2 :(得分:0)
SOAP调用在某处被解码为ASCII - 每个变音符号都是2个字节,高位被设置,当解码为ASCII时变为??
。
所以,这样的事情正在发生:
byte[] bytesSentFromClient = Encoding.UTF8.GetBytes("Ä - Ö - Ü");
string theStringIThenReceiveInMyMethod = Encoding.ASCII.GetString(bytesSentFromClient);
Console.WriteLine(theStringIThenReceiveInMyMethod);
//?? - ?? - ??
要确认这是肯定的,您应该比较stringA == "Ä - Ö - Ü"
而不是在某处打印。
我猜你可以从项目范围内搜索“ASCII”开始,然后如果找到任何东西就可以在那里工作。
您也可以尝试
<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>
在<system.web>
文件中的Web.config
标记下。
答案 3 :(得分:0)
我遇到了同样的问题。 Asmx Web服务将我的UTF-8转换为ASCII,或者更好地说是??????。你的帖子给了我很多帮助。 我发现的解决方案是将SOAP协议的版本从1.1更改为1.2 我的意思是:
POST /WebService1.asmx HTTP/1.1
Host: www.tempuri.org
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.tempuri.org/HelloWorld"
<?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>
<HelloWorld xmlns="http://www.tempuri.org/">
<inputParam>Привет</inputParam>
</HelloWorld>
</soap:Body>
</soap:Envelope>
遇到了问题。但是当我将请求更改为SOAP 1.2时:
POST /WebService1.asmx HTTP/1.1
Host: www.tempuri.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<HelloWorld xmlns="http://www.tempuri.org/">
<inputParam>Привет</inputParam>
</HelloWorld>
</soap12:Body>
</soap12:Envelope>
问题已经解决了。