Blobfeld enthält Murx bei Veröffentlichung via Webservice

5. Juni 2013 12:43

Tag zusammen,

ich habe eine Tabelle in der in einem Blobfeld viel Text gespeichert wird. Der Text wir mit unserem HTML-Editor und folgendem Code eingefügt und ausgelesen:

Code:
CREATE(HTMLEditor);

//-Set HTMLEditor-Properties
HTMLEditor.OpenReadOnly := FALSE; // default TRUE
HTMLEditor.ShowURLPanel := FALSE; // default FALSE
//HTMLEditor.LoadTemplate := FALSE; // default FALSE
//HTMLEditor.TemplateFile := 'c:\mytemplate.html';

HTMLEditor.UseXMLConfigfile:=FALSE; // default FALSE
HTMLEditor.ToolbarFont:=FALSE; // default FALSE
HTMLEditor.ToolbarGeneral:=TRUE; // default FALSE
HTMLEditor.ToolbarOutput:=FALSE; // default FALSE
HTMLEditor.ToolbarMenu:=TRUE; // default FALSE
HTMLEditor.ToolbarInfo:=FALSE; // default FALSE
HTMLEditor.ToolbarLanguage:=FALSE; // default FALSE
HTMLEditor.ToolbarSave:=FALSE; // default FALSE
HTMLEditor.ToolbarUrl:=FALSE; // default FALSE
HTMLEditor.OpenInEditmode:=TRUE; // default FALSE
HTMLEditor.ButtonPanelVisible:=TRUE; // default FALSE
HTMLEditor.SaveOnCloseEditor:=TRUE; // default FALSE
HTMLEditor.CurrentLanguage:=FORMAT(GLOBALLANGUAGE);

HTMLEditor.FormTitle:='Aktuell '+StoreType +' in ' + LanguageCode;

//-Get Data from NAV
myDatastore.SETRANGE(TableNo,NoOfTable);
myDatastore.SETRANGE("No.", ItemNo);
myDatastore.SETRANGE(Type, StoreType);
myDatastore.SETRANGE("Language Code", LanguageCode);

HTMLExists:=myDatastore.COUNT;
IF myDatastore.FIND('-') THEN
BEGIN
myDatastore.CALCFIELDS(Value); // Remarks is a BLOB-Field added to table 5050 contact
HTMLTextRead.READ(StreamInObj);
myDatastore.Value.CREATEINSTREAM(StreamInObj);

WHILE NOT StreamInObj.EOS DO BEGIN
StreamInObj.READTEXT(tmpHTMLText);
HTMLEditor.AppendHTMLText(tmpHTMLText);
END;
END;

HTMLEditor.ShowDialog;

IF HTMLEditor.DialogResultOK THEN BEGIN
IF HTMLExists=0 THEN BEGIN
//myDatastore.INSERT;
myDatastore.TableNo:=NoOfTable;
myDatastore."No.":=ItemNo;
myDatastore.Type:=StoreType;
myDatastore."Language Code":=LanguageCode;
myDatastore."User ID":=USERID;
myDatastore.Updated:=CURRENTDATETIME;
myDatastore.INSERT;
END;
CLEAR(myDatastore.Value);
i := 1;
WHILE NOT HTMLEditor.EOS DO BEGIN
CLEAR(tmpHTMLText);
tmpHTMLText:= HTMLEditor.GetHTMLTextField(i,240);
HTMLText.ADDTEXT(tmpHTMLText);
i += 240;
myDatastore.Value.CREATEOUTSTREAM(StreamOutObj);
HTMLText.WRITE(StreamOutObj);
END;

myDatastore."User ID":=USERID;
myDatastore.Updated:=CURRENTDATETIME;

IF myDatastore.MODIFY THEN
BEGIN
CLEAR(myDatastore);
MESSAGE('Saved');
END;
END;

CLEAR(HTMLEditor);


Bis dahin alles fehlerfrei.

Jetzt habe ich eine Page auf die Tabelle mit dem Blobfeld und diese als Webservice veröffentlicht, und mit einer CU als Extension-Codeunit um die Funktion Blob-Import/Export erweitert. die CU sieht folgendermaßen aus:

Code:
  CODE
  {
    VAR
      DStore@1000000000 : Record 50015;
      Bytes@1000000001 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Array";
      Convert@1000000002 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Convert";
      MemoryStream@1000000003 : DotNet "'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.IO.MemoryStream";
      OStream@1000000004 : OutStream;
      IStream@1000000005 : InStream;

    PROCEDURE SaveToDatastore2@1000000000(Datastore@1000000008 : Record 50015;EntryValue@1000000003 : BigText) stored : Boolean;
    BEGIN
      stored:=FALSE;
      Bytes:=Convert.FromBase64String(EntryValue);
      MemoryStream:=MemoryStream.MemoryStream(Bytes);
      Datastore.Value.CREATEOUTSTREAM(OStream);
      MemoryStream.WriteTo(OStream);
      Datastore.Updated:=CURRENTDATETIME;
      stored:=Datastore.MODIFY;
    END;

    PROCEDURE GetFromDatastore@1000000002(Datastore@1000000008 : Record 50015;EntryTableNo@1000000007 : Code[10];EntryNo@1000000006 : Code[20];Language@1000000005 : Code[10];EntryType@1000000004 : Code[30];VAR EntryValue@1000000003 : BigText) rowscount : Integer;
    BEGIN
      DStore.GET(EntryTableNo,EntryNo,Language,EntryType);

      DStore.SETRANGE(TableNo,EntryTableNo);
      DStore.SETRANGE("No.", EntryNo);
      DStore.SETRANGE(Type, EntryType);
      DStore.SETRANGE("Language Code", Language);
      rowscount:=DStore.COUNT;
      IF DStore.FIND('-') THEN
      BEGIN

      DStore.CALCFIELDS(Value);
      IF NOT DStore.Value.HASVALUE THEN EXIT;

      DStore.Value.CREATEINSTREAM(IStream);
      MemoryStream:=MemoryStream.MemoryStream();
      COPYSTREAM(MemoryStream,IStream);
      Bytes:=MemoryStream.GetBuffer();
      EntryValue.ADDTEXT(Convert.ToBase64String(Bytes));
      END;
    END;
}


Als Text zum Testen habe ich einen IE-Fehlermeldung:
Code:
<h1 id=Heading1>Die verstärkte Sicherheitskonfiguration für Internet Explorer ist aktiviert</h1><P id=Text1>Die verstärkte Sicherheitskonfiguration für Internet Explorer ist momentan auf dem Server aktiviert. Damit werden Sicherheitseinstellungen konfiguriert, die das Browsen von Internet- und Intranetwebsites für Benutzer festlegen. Die Konfiguration verringert das Potenzial von Angriffen des Servers durch Websites, die eventuell ein Sicherheitsrisiko darstellen. Eine vollständige Liste der Sicherheitseinstellungen in dieser Konfiguration finden Sie unter <A HREF='res://iesetup.dll/IESecHelp.htm#effects' TITLE='Auswirkungen der verstärkten Sicherheitskonfiguration für Internet Explorer' id=IEESCLink>Auswirkungen der verstärkten Sicherheitskonfiguration für Internet Explorer</A>.</P> <P id=Text2>Die verstärkte Sicherheitskonfiguration kann verhindern, dass Websites richtig in Internet Explorer dargestellt werden und der Zugriff auf Netzwerkressourcen, wie z. B. UNC-Freigaben, eingeschränkt ist. Wenn Sie eine Website browsen möchten, für die eine deaktivierte Internet Explorer-Funktionalität erforderlich ist, dann können Sie die Website zur Liste der Zone des lokalen Intranets bzw. der vertrauenswürdigen Sites hinzufügen. Weitere Informationen erhalten Sie unter <A HREF='res://iesetup.dll/IESechelp.htm#manage' TITLE='Verwalten der verstärkten Sicherheitskonfiguration für Internet Explorer' id=ManageIEESCLink>Verwalten der verstärkten Sicherheitskonfiguration für Internet Explorer</A>.</p>


Bis zur Hälfte des Textes ist alles richtig, danach nur noch Hiroglyphen.

Der "Fehler" sollte aber innerhalb NAV liege, da ich das Blob (unkomprimiert) auch direkt via SQL abfragen kann und nach Decodierung [mit Dim enc As Encoding = Encoding.GetEncoding(437) und BLOBklartext = enc.GetString(SQLAbfrage.Blobfeld)] genau den gleichen Murx nach etwa der Hälfte des Textes erhalte.

NAV 2009 R2 (32012). SQL-Version (2008 oder 2012) spielt offensichtlich keine Rolle.

Mach ich was falsch oder ist das ein Feature?

Volker

Re: Blobfeld enthält Murx bei Veröffentlichung via Webservic

5. Juni 2013 12:54

Seit dem Ur-Build von NAV 2009R2 hat sich einiges beim Webservice getan.
Ich würde erstmal das Build updaten.

Was ist denn der letzte Text bevor die "hiroglyphen" anfangen?

Re: Blobfeld enthält Murx bei Veröffentlichung via Webservic

5. Juni 2013 13:20

Das ist der Text, der immer kommt:
Code:
<h1 id=Heading1>Die verstärkte Sicherheitskonfiguration für Internet Explorer ist aktiviert</h1><P id=Text1>Die verstärkte Sicherheitskonfiguration für Internet Explorer ist momentan auf dem Server aktiviert. Damit werden Sicherheitseinstellungen konfiguriert, die das Browsen von Internet- und Intranetwebsites für Benutzer festlegen. Die Konfiguration verringert das Potenzial von Angriffen des Servers durch Websites, die eventuell ein Sicherheitsrisiko darstellen. Eine vollständige Liste der Sicherheitseinstellungen in dieser Konfiguration finden Sie unter <A HREF='res://iesetup.dll/IESecHelp.htm#effects' TITLE='Auswirkungen der verstärkten Sicherheitskonfiguration für Internet Explorer' id=IEESCLink>Auswirkungen der verstärkten Sicherheitskonfiguration für Internet Explorer</A>.</P

Danach etwa:
Code:
E WeeTePe-NDUereheeqeâeere?ereâeeZeα eree < BODY EVE╢EEUEZEEDERE WEETE╢E></DIV < BODY Comment` Code Date No. Line No. Type Document      e¼  d█_Lf <df CurrFieldNo  xRec  Rec4f  ÿf█_Lf█_Lç dddddd╦f╠f═f ╔Ü;<(ef dp Aé></DIV                      ÿ            f  ∞            f  ∞             ç                    Rec 4f              xRec              CurrFieldNo                 <            d       f         d       ∞  f                                             e └                                                              Key      Description        Number       Contact No.      Name         Type           E-Mail  `"   String

und es fehlt der Rest des Test-Textes.

An neuen Build dachte ich auch, aber dann dürfte die direkte SQL-Abfrage auf den SQL-Server (ohne irgendeine Einbeziehung von NAV) nicht das gleiche Ergebnis wie die Abfrage über den Webservice bringen. Les ich das Feld innerhalb NAV über den HTML-Editor aus ist alles bestens und es kommt kein Murx.

Bei dem Murx würde ich ja behaupten, dass sind die Felder der Tabelle, aber das stimmt nicht. Ich habe auch mal die Bytes in dem Blobfeld der SQL-Tabelle gezählt. Das sind viel zu viele für den Text. Aber interessanterweise wird der ganze Murx im HTML-Editor nicht angezeigt, sondern der korrekte komplette Test-Text.

Ich bekomme es nicht gebacken.

Volker

Re: Blobfeld enthält Murx bei Veröffentlichung via Webservic

5. Juni 2013 13:31

Da fehlen noch ein paar Infos.
Wozu brauchst Du den WebService?
Wieso nimmst Du eine Page als WebService und nicht eine CU die das bewerkstelligt? Die Standard-Funktionen einer published Page brauchst Du ja nicht.

Re: Blobfeld enthält Murx bei Veröffentlichung via Webservic

5. Juni 2013 13:34

Code:
WHILE NOT HTMLEditor.EOS DO BEGIN
  CLEAR(tmpHTMLText);
  tmpHTMLText:= HTMLEditor.GetHTMLTextField(i,240);
  HTMLText.ADDTEXT(tmpHTMLText);
  i += 240;
  myDatastore.Value.CREATEOUTSTREAM(StreamOutObj);
  HTMLText.WRITE(StreamOutObj);
END;


Kurze Frage, warum erzeugst du mit jedem Durchlauf den OutStream neu?

wäre das nicht korrekter?

Code:
myDatastore.Value.CREATEOUTSTREAM(StreamOutObj);
WHILE NOT HTMLEditor.EOS DO BEGIN
  CLEAR(tmpHTMLText);
  tmpHTMLText:= HTMLEditor.GetHTMLTextField(i,240);
  HTMLText.ADDTEXT(tmpHTMLText);
  i += 240;
END;
HTMLText.WRITE(StreamOutObj);

Re: Blobfeld enthält Murx bei Veröffentlichung via Webservic

5. Juni 2013 14:20

@fiddi:
So genau weiß ich das nicht mehr, hatte aber einen Grund. Aber ich habe das jetzt trotzdem mal getestet. Es ändert am Problem nichts. Der einzige Unterschied ist, dass Öffnen und Schließen des Editors in meiner Version schneller ist. Eigentlich doch unlogisch, oder?

@Jan:
Das ganze ist Teil einer Webshop-Anbindung. Mein Tool kann sowohl direkt mit SQL, also auch via Webservice Daten aus NAV in den Webshop übertragen. Das Ganze läuft als Dienst auf dem SQL-Server. Daten aus dem Webshop werden nur per Webservice nach NAV gebracht. Das mit der Page ging schneller und bis jetzt habe ich damit auch gute Erfahrungen, v. a. wenn ich neue Daten in NAV anlegen muss. Aber im Prinzip ist es egal, ob Page, CU oder direkter SQL-Zugriff. Die Daten werden ja innerhalb NAV (CC) angelegt und da stimmt ja auch (optisch) alles.

Ich habe nun auch mal das Blobfeld mittels EXPORT in eine Textdatei exportiert. und auch da ist der Murx dann drin. Das legt die Vermutung an den Editor als Übeltäter nahe. Warum der aber den Murx fehlerfrei darstellen kann ist mir echt ein Rätsel.

Volker