Tworzę prosty web serwis, który łączy się do bazy danych i wyrzuca dla osoby wchodzącej na link XML'a.

namespace web
{
    /// <summary>
    /// Opis podsumowujący dla WebService
    /// </summary>
    [WebService(Namespace = "test")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // Aby zezwalać na wywoływanie tej usługi sieci Web ze skryptu za pomocą kodu ASP.NET AJAX, usuń znaczniki komentarza z następującego wiersza. 
    // [System.Web.Script.Services.ScriptService]
    public class WebService : System.Web.Services.WebService
    {


        public SqlConnection con;
        public SqlDataAdapter adap;
        public DataSet ds;
        public string query;
        public SqlCommand sqlcom;
        public XmlReader reader;
        [WebMethod]
        public XmlReader GetProduct()
        {
            con = new SqlConnection(@"Data Source=;Initial Catalog=;Persist Security Info=True;User ID=;pwd=;");
            con.Open();
            query = @"";
            //adap = new SqlDataAdapter(query, con);
            sqlcom =  new SqlCommand(query, con);

            ds = new DataSet();
            reader = sqlcom.ExecuteXmlReader();

            con.Close();
            return reader;
            // adap.Fill(ds);
            //   return ds;
        }
    }
}


I tak, jak wykorzysytwałem SqlAdapterQuery i zwracałem DataSet to wykonywało się, ale całą strukturę XML'a jaką mam stworzoną w zapytaniu rozwalało.
Dlatego zmieniłem na XMLReader, ale chyba coś robię nie tak. Ponieważ jak odpalam już web serwis i chcę pokazać XML'a to dostaję taki oto błąd::

System.InvalidOperationException: Wystąpił błąd podczas generowania dokumentu XML. ---> System.InvalidOperationException: Element System.Xml.XmlTextReaderImpl jest niedostępny z powodu swojego poziomu zabezpieczenia. Tylko typy publiczne mogą być przetwarzane.
   w System.Xml.Serialization.TypeDesc.CheckSupported()
   w System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
   w System.Xml.Serialization.XmlSerializationWriter.CreateUnknownTypeException(Type type)
   w Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write2_XmlReader(String n, String ns, XmlReader o, Boolean isNullable, Boolean needType)
   w Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write3_XmlReader(Object o)
   w Microsoft.Xml.Serialization.GeneratedAssembly.XmlReaderSerializer.Serialize(Object objectToSerialize, XmlSerializationWriter writer)
   w System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
   --- Koniec śladu stosu wyjątków wewnętrznych ---
   w System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
   w System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
   w System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue)
   w System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
   w System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
   w System.Web.Services.Protocols.WebServiceHandler.Invoke()

Dobrze mi się wydaje, że muszę jeszcze opisać w kodzie co jest Poziomem Root każdego z elementu z query? Mimo, że tam to jest opisane?

Przykład zapytania SQL poniżej

select 
1 as Tag,  
        null as Parent, 
		null as [Katalog!1],
		null as [Produkt!2!NumerKatalogowy!element],
		null as [Produkt!2!Nazwa!Element],
		null as [Produkt!2!NazwaDługa!Element],
		null as [Produkt!2!Opis!CDATA],
		null  as [Produkt!2!VAT!Element],
		null as [Produkt!2!EAN!Element],
		null  as [Produkt!2!StrukturaTowarowa!Element],
		null as [Multimedia!3!Zdjęcie_Główne!element],
		null as [Produkt!2!Producent!Element],
		null as [Produkt!2!Marka!Element],
		null as [Atrybut!4!Waga!Element],
		null as [Atrybut!4!Pasuje_do_modelu!Element],
		null as [Atrybut!4!Gwarancja!Element],
		null as [Atrybut!4!Szerokość!Element],
		null as [Atrybut!4!Wysokość!Element],
		null as [Atrybut!4!Głębokość!Element]

// Kilka UNION ALL dla każdego poziomu pozyskującego dane

order by [Produkt!2!NumerKatalogowy!element], Parent
for xml explicit