Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML文档中存在错误。。。调用web服务时_C#_Xml_Web Services_Encoding - Fatal编程技术网

C# XML文档中存在错误。。。调用web服务时

C# XML文档中存在错误。。。调用web服务时,c#,xml,web-services,encoding,C#,Xml,Web Services,Encoding,我已经创建了一个web服务和其中的一个函数,它应该返回从普及数据库检索到的11000条记录的列表 下面是我在web服务中的功能 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class BBI : System.Web.Ser

我已经创建了一个web服务和其中的一个函数,它应该返回从普及数据库检索到的11000条记录的列表

下面是我在web服务中的功能

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class BBI : System.Web.Services.WebService
{
    [WebMethod]
    public List<myObject> getAll()
    {
        List<myObject> result = new List<myObject>();
        PsqlConnection conn = new PsqlConnection("Host=soemthing;Port=something;Database=something;Encoding=IBM861");
        conn.Open();
        string strSql = "select 0, 1, 2, 3, 4, 5 from something";
        PsqlCommand DBCmd = new PsqlCommand(strSql, conn);
        PsqlDataReader myDataReader;
        myDataReader = DBCmd.ExecuteReader();
        while (myDataReader.Read())
        {
            myObject b = new myObject();
            b.0 = Convert.ToInt32(myDataReader[0].ToString());
            b.1 = myDataReader[1].ToString();
            b.2 = myDataReader[2].ToString();
            b.3 = myDataReader[3].ToString();
            b.4 = myDataReader[4].ToString();
            b.5 = myDataReader[5].ToString();
            result.Add(b); 
        }
        conn.Close();
        myDataReader.Close();
        return result;
    }
}
数据库记录包含各种奇怪的符号,例如
·rmann Kr.Einarsson
Tv“'fint’ri


有人能看出我做错了什么吗?

您的数据库是否包含这些奇怪的字符?如果是这样,那就是数据库/客户机编码问题。调试服务器时,您能正确地看到字符串吗?如果是这样,那就很奇怪了。无论如何,我想我记得,如果有\0个字符,那么这些SOAP Web服务喜欢抛出错误,但它在WCF中工作,但我重复一遍,我不确定。不过,首先不应该有奇怪的字符。

使用SoapUI使用服务,发送请求,然后看看您得到了什么。如果它在SoapUI中看起来不错,那么您就知道它是从数据库中正确读取和馈送的,问题可能出在您的客户机上,可能是编码上。如果在SoapUI中出现错误,则表明服务器端或数据库中的数据有问题


像SoapUI和Fiddler这样的工具对于中间人来说是很棒的。当您不确定这是服务器还是客户端的问题时,将问题一分为二总是有帮助的。

您可以在这里找到答案:

这是因为XML中不允许使用某些字符,必须用转义实体替换或删除这些字符。正如上面的链接中所提到的,要找到它可能很困难

以下是一些代码,如果它保留了字符,则会复制问题:

string xml = @"<title></title>";
var doc = new XmlDocument();

// Fails before escaping invalid chars.
try {
    doc.LoadXml(xml);
} catch(XmlException ex) {
    ex.Dump("Before");
}

// Works after escaping.
xml = xml.Replace("", "&#xB;");
xml = xml.Replace("", "&#x1;");
doc.LoadXml(xml);
doc.Dump("After");
stringxml=@”;
var doc=新的XmlDocument();
//在转义无效字符之前失败。
试一试{
doc.LoadXml(xml);
}捕获(XmlException-ex){
交货前(“交货前”);
}
//逃跑后工作。
xml=xml.Replace(“,”和#xB;”);
xml=xml.Replace(“,”;”);
doc.LoadXml(xml);
文件转储(“之后”);

我无法在此处显示我所期望的无效字符,但您可以使用十六进制编辑器创建它们并将其传递到代码中,然后用实体转义字符替换它们。

在return语句之前放置一个断点,并使用调试工具浏览列表。检查数据在集合中是否有奇怪的符号。如果确实如此,则需要转义这些特殊字符,以便序列化响应


查看4.5框架附带的ASP.NET Web API,您可以更好地控制将响应转换为客户端的序列化程序

数据库包含这些字符,但在调试服务器时已消失。然而,有这个迹象\“当应该有引用的时候。我认为这可能会弄乱XML。XmlSerializer有点崩溃,因为它无法发送这些无效字符。也许有解决办法,试试谷歌搜索。但是,最好的解决方案是正确处理数据库中的编码。这样,就不会有任何无效字符引起问题。通过在发送前将文本转换为字节来解决
System.InvalidOperationException was unhandled by user code
  Message=There is an error in XML document (1, 71897).
  Source=System.Xml
  StackTrace:
       at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
       at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
       at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
       at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
       at BBI.BBI.getAllBooks() in c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\vefur\73db60db\a4ee31dd\App_WebReferences.jl1r8jv6.0.cs:line 252
       at webServiceFuncions.getAllBooks() in c:\Documents and Settings\forritari\Desktop\Vefur - Nýr\BBI\trunk\Vefur\App_Code\webServiceFuncions.cs:line 59
  InnerException: System.Xml.XmlException
       Message='', hexadecimal value 0x01, is an invalid character. Line 1, position 71897.
       Source=System.Xml
       LineNumber=1
       LinePosition=71897
       SourceUri=""
       StackTrace:
            at System.Xml.XmlTextReaderImpl.Throw(Exception e)
            at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
            at System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res, String[] args)
            at System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline(Int32 startPos, Boolean expand, StringBuilder internalSubsetBuilder, Int32& charCount, EntityType& entityType)
            at System.Xml.XmlTextReaderImpl.ParseCharRefInline(Int32 startPos, Int32& charCount, EntityType& entityType)
            at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
            at System.Xml.XmlTextReaderImpl.ParseText()
            at System.Xml.XmlTextReaderImpl.ParseElementContent()
            at System.Xml.XmlTextReaderImpl.Read()
            at System.Xml.XmlTextReader.Read()
            at System.Xml.XmlReader.ReadElementString()
            at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderBBI.Read2_Book(Boolean isNullable, Boolean checkType)
            at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderBBI.Read20_getAllBooksResponse()
            at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer35.Deserialize(XmlSerializationReader reader)
            at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
       InnerException: 
string xml = @"<title></title>";
var doc = new XmlDocument();

// Fails before escaping invalid chars.
try {
    doc.LoadXml(xml);
} catch(XmlException ex) {
    ex.Dump("Before");
}

// Works after escaping.
xml = xml.Replace("", "&#xB;");
xml = xml.Replace("", "&#x1;");
doc.LoadXml(xml);
doc.Dump("After");