我支持基于.NET 3.5构建的C#(.asmx)Web服务。这是一个非常非常简单的服务,在其他一些东西中返回一个街道地址。最近扩展了提供服务的应用程序的范围,现在它背后的数据库也包含国际地址。这意味着可以存储拉丁语外语字符(重音符号,变音符号等),并因此在Web服务响应中返回。
当我使用soapUI自动生成的请求在本地测试服务并且不添加任何特殊标头或任何其他内部信息时,我看到这个元素与数据库中存储的完全相同 - 带有重音标记:
<CompositeStreet>140-146 RUE EUGÈNE DELACROIX</CompositeStreet>
但是,当连接系统调用服务时,IT人员会报告响应中包含通常用作替换不支持字符的问号:
<compositeStreet>140-146 RUE EUG?NE DELACROIX</compositeStreet>
我不确定这是谁的问题,我担心服务的简单设计可能意味着我不得不重新编码,以确保任何消费者都能看到UTF-8编码的数据。我一直认为UTF-8是默认编码,并且不需要任何明确的编码。 (请保存有关升级到另一个线程的WCF的讨论 - 现在不在此范围内。)
您能看看服务的结构,并告诉我是否确实需要在我身边做些什么? (为了讨论起见,代码大幅缩小)
ASMX页面 - 基本上WebMethod接受请求并返回响应:
namespace Company.IT.Network.LocationStore.LS_Services
{
using . . .;
[WebService(Namespace = "Company.IT.Network.LocationStore.LS_Services.ClliRecordService")]
public class ClliRecordService : System.Web.Services.WebService
{
public ClliRecordService() { }
[WebMethod(Description = "Lengthy description")]
public VZBServiceResponse ClliLookup_VzbSite(VZBServiceRequest sRequest)
{
VZBServiceResponse sResponse = new VZBServiceResponse(sRequest);
return sResponse;
}
}
可序列化类,它是VZBServiceResponse类型的属性,最终出现在XML响应中。您将看到所有内容都是[Serializable]
属性以及返回的元素顺序的设置。
namespace Company.IT.Network.LocationStore.LS_Lib.BO
{
using ...;
[Serializable]
public class Address
{
private string _compositeStreet;
private string _buildingName;
[XmlElement(Order = 0)]
public string BuildingName
{
get { return _buildingName; }
set { _buildingName = value; }
}
[XmlElement(Order = 1)]
public string CompositeStreet
{
get { return _compositeStreet; }
set { _compositeStreet = value; }
}
}
}
真的没有比这更多的了。没有通过内存流(我在某些帖子中看到)或通过Serialize或Deserialize方法进行特定处理来格式化XML响应。
是否有建议对此进行改进,以确保服务使用者能够获得外语字符或者是否真的取决于呼叫系统?感谢您的任何指导!