在ASP.NET WebService中接受UTF-8编码的字符串

时间:2012-12-04 14:40:11

标签: asp.net web-services unicode encoding utf-8

我有一个看起来像这样的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编码。

4 个答案:

答案 0 :(得分:4)

最后,事实证明在接受HTTP消息时出现了问题。我实际上并不知道是什么操纵HTTP-Request,但我找到了解决方法。尽管Fiddler在我的text/xml; charset=utf-8中向我显示了正确的内容类型(Application_BeginRequestRequest.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>

问题已经解决了。