2010-12-29 14 views
3

に呼び出したとき、私は、Webサービスを作成している。ここで普及してデータベースからXMLドキュメントに誤りがあり... Webサービス

をretreived 11thousandレコードのリストを返す必要があり、その中に関数が私の関数であります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; 
    } 
} 

次に、クライアントプログラムでこのWebサービスへのWeb参照を追加し、参照BBIを呼び出します。 次に、getAll関数を呼び出して、エラーを取得します。XML文書にエラーがあります(1、63432)。ここで

public List<BBI.myObject> getAll() 
{ 
    BBI.BBI bbi = new BBI.BBI(); 

    List<BBI.myObject> allBooks = bbi.getAll().OfType<BBI.myObject>().ToList(); 
    return allBooks; 
} 

が総例外の詳細

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: 

あるデータベースレコードは、誰かがイムはここで間違っているのかを見ることができます例¤rmann Kr. EinarssonTv” ‘fint˜ri

ために、奇妙なシンボルのすべての種類を含むていますか?

答えて

1

データベースにこれらの変な文字が含まれていますか?もしそうなら、それはデータベース/クライアントエンコーディングの問題です。あなたは、サーバーをデバッグするときに文字列を正しく見ることができますか?もしそうなら、それは非常に奇妙です。とにかく\ 0文字があれば、これらのSOAP Webサービスはエラーをスローするのが好きだが、それはWCFで動作することを覚えていると思うが、繰り返すが、わからない。それにもかかわらず、最初に奇妙な文字があってはいけません。

+0

データベースにはこれらの文字が含まれていますが、サーバーのデバッグ時には消えています。しかし、引用符があると思われるときはこの記号があります。私はこれがXMLを台無しにしているかもしれないと思う。 –

+0

XmlSerializerは無効な文字を送信できないため、少し壊れています。たぶん、回避策がある、グーグルで試してみてください。ただし、データベース内のエンコーディングを正しく処理するための最良の解決方法があります。そうすれば、問題を引き起こす無効な文字はありません。 – fejesjoco

+0

送信前にテキストをバイトに変換して解決しました。 –

2

サービスをSoapUIで消費し、リクエストを送信し、返品を確認します。それがSoapUIでうまく見えれば、それはデータベースから正しく読み込まれ、フィードされていることを知っています。問題はおそらくエンコーディングでクライアントにある可能性があります。 SoapUIで間違っている場合は、サーバー側またはデータベース内のデータに問題があります。

SoapUIやFiddlerのようなツールは、この種のものについての中間者検査のために素晴らしいです。また、サーバやクライアントで問題が発生しているかどうか不明な場合は、問題を半分にすることが常に役立ちます。

1

あなたはここで答えを見つけることができます:The quest for 0x0B

特定の文字は、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"); 

私は私が予想され、ここで表示するために、無効な文字を取得することはできませんが、六角でそれらを作成することができますエディタを通過してコードに入れてからエンティティエスケープ文字に置き換えます。

0

return文の直前にブレークポイントを置き、デバッグツールを使用してリストを参照してください。データの中に奇妙なシンボルがコレクション内にあるかどうかチェックします。そうであれば、レスポンスをシリアル化するために特殊文字をエスケープする必要があります。

4.5フレームワークに付属するASP.NET Web APIをチェックすると、応答をクライアントに変換するシリアライザをより詳細に制御できます。

関連する問題