23. februar 2010 - 10:40Der er
19 kommentarer og 1 løsning
Skrive SOAP reply fra webservice til XML-fil
Hej Jeg er data warehouse udvikler og har fået til opgaven at udtrække data fra en webservice. Den eneste måde jeg kan tilgå denne webservice er ved at kode det og det er absolut ikke min stærke side. Jeg har fået hul igennem til webservicen i en Cookie-container da webservicen er session/cookiebaseret.
Mit problem er at ikke rigtig ved hvordan jeg skal trække soap-repliet ud. Jeg har både prøvet at smide det ud i en fil og smide det ud i en consol, men jeg kan ikke finde ud af få det smidt ud på en ordentligt måde.
Følgende fungerer:
public void Main() { dk.bilstatistik.regdata.RegDataService svc = new dk.bilstatistik.regdata.RegDataService(); svc.CookieContainer = new System.Net.CookieContainer(); svc.Init("...", "...");
public void Main() { dk.bilstatistik.regdata.RegDataService svc = new dk.bilstatistik.regdata.RegDataService(); svc.CookieContainer = new System.Net.CookieContainer(); svc.Init("...", "...");
//her kan vi ligeså godt parse med det samme, istedet for at smide xml'en ind i et object.
var test = XDocument.Parse( svc.HentNyesteBestand() ); test.Save(@"C:\Temp\test.xml);
Returnerer svc.HentNyesteBestand() en string med XML eller returnerer den en instans af en custom klasse eller en collection af en custom klasse ?
Hvis det er en string med XML, så er det bare at gemme den til en fil. En StreamWriter er formentligt det mest oplagte.
Hvis det er en instans af en custom klasse eller en collection af en custom klasse, så skal du have konverteret dette til XML inden du udskriver. En mulighed for dette er XmlSerializer klassen.
Jeg vil fraråde at hapse den rå SOAP XML ved at udskifte WS stub med WebClient/(Http)WebRequest. Der vil være alt for meget junk i det XML.
Tak for svaret. Jeg er ret sikker på at det er en collection den returnerer for når jeg forsøger at smide det ud i en streng får jeg kun object-referencen, men igen jeg er ved ikke så meget om programmering.
Når jeg "hover" over metode-kaldet i Visual Studio står der
namespace E { public class Data { public int Iv { get; set; } public string Sv { get; set; } } public class Program { public static void Main(string[] args) { Data[] d = new Data[3]; d[0] = new Data { Iv=123, Sv="ABC" }; d[1] = new Data { Iv=456, Sv="DEF" }; d[2] = new Data { Iv=789, Sv="GHI" }; XmlSerializer ser = new XmlSerializer(typeof(Data[])); ser.Serialize(Console.Out, d); Console.ReadKey(); } } }
Cannot implicitly convert type dk.bilstatistik.regdata.IDBetegnelse[]' to csproj.ScriptMain.IDBetegnelse
Skyldes det at der forventes et array eller er det fordi jeg blot har lavet en klasse med samme navn som det returnerede og de som sådan ikke har noget at gøre med hinanden?
Det kan vel ikke være rigtigt at jeg skal erklære en klasse det hedder det samme som den objekttype der forventes returneret?
Nu tænkte jeg mig lidt om og prøvede istedet sådan her:
//Webservice DBI dk.bilstatistik.regdata.RegDataService svc = new dk.bilstatistik.regdata.RegDataService(); svc.CookieContainer = new System.Net.CookieContainer(); svc.Init("...", "...");
dk.bilstatistik.regdata.IDBetegnelse[] test = new dk.bilstatistik.regdata.IDBetegnelse[1000];
test = svc.HentBiltyper();
XmlSerializer ser = new XmlSerializer(typeof(dk.bilstatistik.regdata.IDBetegnelse)); ser.Serialize(Console.Out, test); Console.ReadKey();
Nu kan jeg da builde det, men der er 2 problemer.
For det første vil den kun builde hvis jeg skriver en størrelse på arrayet - 1000 lige nu? Hvordna kan jeg gøre det dynamisk. jeg har jo ingen chance for at vide hvor mange objekter der kommer tilbage?
Derudover fejler koden stadigvæk når den køres:
SSIS package "Package.dtsx" starting. Error: 0x1 at Script Task: System.Reflection.TargetInvocationException: Destinationen for en aktivering udløste en undtagelse. ---> System.InvalidOperationException: Der opstod en fejl under oprettelse af XML-dokumentet. ---> System.InvalidOperationException: Typen ST_0308cbac94774343ab1e8449501ed7d9.csproj.dk.bilstatistik.regdata.IDBetegnelse[] kan ikke bruges i denne kontekst. ved Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterIDBetegnelse.Write2_IDBetegnelse(String n, String ns, Object o, Boolean isNullable, Boolean needType) ved Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterIDBetegnelse.Write3_IDBetegnelse(Object o) --- Slut på staksporing af indre undtagelser --- ved System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) ved System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces) ved System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o) ved ST_0308cbac94774343ab1e8449501ed7d9.csproj.ScriptMain.Main() --- Slut på staksporing af indre undtagelser --- ved System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) ved System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) ved System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) ved System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) ved System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) ved System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, CultureInfo culture) ved Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() Task failed: Script Task SSIS package "Package.dtsx" finished: Success.
Hmmmh, det virkede som om der skete noget. umiddelbart kom der dog først en fejl med udskriften:
**********
SSIS package "Package.dtsx" starting. Error: 0x1 at Script Task: System.Reflection.TargetInvocationException: Destinationen for en aktivering udløste en undtagelse. ---> System.InvalidOperationException: Det er ikke muligt at læse nøgler, når ingen af programmerne har en konsol, eller når konsolinput er blevet omdirigeret fra en fil. Prøv Console.Read. ved System.Console.ReadKey(Boolean intercept) ved ST_0308cbac94774343ab1e8449501ed7d9.csproj.ScriptMain.Main() --- Slut på staksporing af indre undtagelser --- ved System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) ved System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) ved System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) ved System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) ved System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) ved System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, CultureInfo culture) ved Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript() Task failed: Script Task SSIS package "Package.dtsx" finished: Success.
**********
Jeg rettede derefter:
Console.ReadKey();
-->
Console.Read();
Så fejlede den ikke, men der sker ikke noget.
Kan man i stedet skrive direkte til en fil i stedet så man kan se om der "sker" noget?
Fantastisk. Nu er der hul igennem. Så er det bare at gemme det et sted og hive dem ind i mit ETL-værktøj.
Det eneste lille mén er at når jeg kalder nogle af webservices får jeg et timeout. Jeg har fået af vide at serveren først timer ud efter 20 minutter så det må næsten være noget hos mig.
Har du noget bud på om det kan være koden der timer ud eller man kan læse asynkront?
Såfremt det ikke siger dig noget er jeg rigelig taknemmelig for din hjælp og vil meget gerne give dig point.
Integration Services 2008 i det her tilfælde. Der findes jo en webservice komponent den understøtter bare ikke cookies/sessions.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.