Gelöst Open a Report from DLL

kkraljevic

Neues Mitglied
Hello everyone,
I'm new in the world of sage developers and I've got some errors while trying to open a Report from a WPF in Warenwirtschaft.
The error that it returned is this and it happens when try to execute vm.OpenReport();

1636386684239.png

This is my code to open a report

private void Btn_ArtikelMargenListe(object sender, RoutedEventArgs e)
{
try
{
var ArtikelMargenListeKey = _reportList.Where(r => r.Name == "rptArtikelOhneBestand").Select(r => r.KeyValue).First();
LoadNamedParameters();
var vm = CreateViewModel();
if (vm == null) return;

var externalViewer = new FrmExternalViewerWpf();
vm.ReportViewerControl = externalViewer.CtlViewer;
vm.ReportViewerControl.ViewModel = vm;

vm.OpenReport(
ReportingApplicationEnum.OfficeLine, _endpoint,
Properties.Settings.Default.UserName, Global.SecurePassword,
Properties.Settings.Default.ApplicationId, false,
ArtikelMargenListeKey, vm.ReportNamedParameters,
Properties.Settings.Default.Language,
false, null, string.Empty
);

_externalViewerWpf = externalViewer;
externalViewer.ShowDialog();
_externalViewerWpf = null;
}
catch (Exception ex)
{
throw;
}
}
 

mamueller

Mitglied
Der HTTP-Statuscode 401 Unauthorized gibt an, dass der Server die Anfrage aufgrund fehlender oder ungültiger Authentifizierung abgelehnt hat.
Überprüfen Sie den Benutzernamen und das Passwort. Bei leerem Benutzernamen und leerem Kennwort wird NT-Authentifizierung verwendet.
Der Benutzer benötigt in der Sage 100 auch die entsprechnenden Rechte und Lizenzen, sonst wird der nächste Fehler geworfen 403 = Forbidden.
 

kkraljevic

Neues Mitglied
Besten Dank für Ihre rasche Rückmeldung. Ich habe die Authentifizierung des Benutzers geprüft. Der Benutzer verfügt über einen Benutzernamen und PW sowie die entsprechenden Lizenz-Zuweisungen.
1636447265979.png
Wenn ich die URL im Browser öffne, erscheint folgende Fehlermdlung:
1636447446343.png

wenn ich "weiter" klicke, erscheint nachfolgende Meldung:
1636447583334.png

Können Sie mir da weiterhelfen?
Besten Dank und freundliche Grüsse!
 

mamueller

Mitglied
Im ersten ScreenShot fehlt der Name (oder besser die Bezeichnung) der Datenbank. Diese muss vor dem Semikolon stehen und der Mandant nach dem Semikolon. Die Fehlermeldung im Browser ist ok, wenn man das Zertifikat nicht installiert hat und außerdem wird mit dem Aufruf im Browser immer ein GET ausgeführt. GET wird nicht unterstützt, ein Service-Aufruf muss immer mit POST erfolgen.
 

kkraljevic

Neues Mitglied
Ich habe das mit der Bezeichnung und Mandant bereits implementiert, das passt so auf die entsprechende Datenbank. Daran kann es nicht liegen. Haben Sie sonst noch eine Idee?
Vielen Dank und viele Grüsse
 

mamueller

Mitglied
Ist der Port in der Url (kann ich leider nicht sehen), der Port für Https mit Basic-Authentication? Können Sie die Requests mit Fiddler mitschneiden und das SAZ-Archiv zur Verfügung stellen?
 

kkraljevic

Neues Mitglied
Guten Morgen,
Wie von Ihnen gewünscht, stelle ich Ihnen das SAZ-Archiv zur Verfügung und hoffe, dass es Ihnen weiterhilft.
 

Anhänge

  • sessions.zip
    15,6 KB · Aufrufe: 8

kkraljevic

Neues Mitglied
Wenn Sie die Sitzungsdatei öffnen, sehen Sie diese Zeilen nicht?
Wie Sie sehen können, wird Port 5493 für die anfängliche Authentifizierung und Port 5494 für das Öffnen von Berichten verwendet.
1636639874812.png
 

mamueller

Mitglied
HTTP wird nicht funktionieren. 5493 ist der Port für HTTPS-Basic- und 5494 für Windows-Authentication. Der ScreenShot von Ihnen zeigt HTTP aber mit dem HTTPS-Port. Bitte vergleichen Sie die ScreenShots. HTTP sollte mittlerweile komplett abgeschaltet sein. Ich verwende es nur zu Testzwecken. Haben Sie in Fiddler das Capturen von HTTPS-Requests aktiviert und das Fiddler-Root-Zertifikat installiert? Wodurch wird bei Ihnen der Port-Wechsel ausgelöst?
 

kkraljevic

Neues Mitglied
1636708724712.png
Ich habe das https-Zertifikat in Fiddler aktiviert, ich hoffe, dieser Screenshot kann Ihnen helfen.
Ich verwende Sage Solution Codes, in diesem Fall verwende ich die ReportingEngineExt, die Sie unter C:\Program Files (x86)\Sage\Sage 100\9.0\SDK\BEISPIELE\Kapitel_11_ReportingEngineExt\SOURCE finden. Der Port, der auf 5493 eingestellt ist, ist eine Funktion, die dies automatisch tut:

Global.MyEndpoint = ServerConfigurationProxy.GetSDataHttpsEndpoint(true, 0, 0);

Dies ist die URL string

_endpoint = String.Join("/", Global.MyEndpoint.Address, "ol", "ControlCenterData",
"MeiliTrading" + ";" + mandant.Id);
 

mamueller

Mitglied
ServerConfigurationProxy.GetSDataHttpsEndpoint(useIntegratedSecurity, 0, 0);
Der erste Parameter dieser Funktion ist bei Ihnen auf true gesetzt. True bedeutet hier -> HTTPS/NT-Authentication verwenden. Damit landen Sie auf Port 5494. Dann dürfen Sie keinen UserName übergeben. Mit false wird der Port 5493 und HTTS/Basic-Authentication verwendet. Dann müssen Sie UserName und Passwort übergeben. Schnellste Lösung in diesem Fall:
ServerConfigurationProxy.GetSDataHttpsEndpoint(false, 0, 0);
 
Zuletzt bearbeitet:

kkraljevic

Neues Mitglied
Hallo,
Die WPF welche wir erstellt haben wird innerhalb der Warenwirtschaft über einen Menüpunkt gestartet. Darin werden Reports erzeugt mit Daten der Warenwirtschaft. Gibt es eine Möglichkeit, dass beim Start des WPF der angemeldete Benutzer für die Authentifizierung des WPF verwendet wird? Und falls ja, wie?
Jetzt gebe ich den Benutzer und das Passwort manuell ein, also:
var useIntegratedSecurity = "kk"
NamePasswortCredentials Anmeldeinformationen;
credentials = new NamePasswordCredential(useIntegratedSecurity, "kk");
 

mamueller

Mitglied
Ich verstehe leider weder die Aufgabenstellung noch Ihr Beispiel nicht.
Aber wenn Sie den Windows-Login verwenden wollen, verwenden Sie den Konstruktor ohne Parameter.
credentials.UseDefaultCredential(); verwendet den angemeldeten Windows-Benutzer.

NamePasswordCredential credentials;
if (string.IsNullOrEmpty(TxtUserName.Text))
{
credentials = new NamePasswordCredential();
credentials.UseDefaultCredential();
}
else
{
credentials = new NamePasswordCredential(TxtUserName.Text, TxtPassword.Text);
}
 

kkraljevic

Neues Mitglied
LÖSUNG GEFUNDEN

Ich habe eine WPF erstellt, die mehrere Schaltflächen zum Öffnen von Berichten enthält, die in AppDesigner erstellt wurden.
Dieses WPF wird über einen im Regiezentrum angelegten Eintrag geöffnet.
Dies ist die WPF, die alle Schaltflächen zum Öffnen der verschiedenen Berichte enthält:
1656664068540.png
Sobald Sie auf eine Schaltfläche klicken, öffnet sich ein Fenster, in dem Sie die Parameter konfigurieren können. Nach der Konfiguration können Sie den Bericht ausdrucken oder einfach nur ansehen.
1656664087647.png
Um dieses Fenster zu öffnen und meinen ReportViewer zu verwenden, muss ich eine Session erstellen, in die ich Anmeldedaten eingeben muss.
Gegenwärtig sind die Anmeldedaten fest kodiert, also:
var useIntegratedSecurity = "kk";
NamePasswordCredentials credentials;
credentials = new NamePasswordCredential(useIntegratedSecurity, "kk");

Ich muss eine Lösung finden, um den Benutzer zu nehmen, der gerade in Warenwirtschaft angemeldet ist, und seine Anmeldedaten zu verwenden.

Die Lösung bestand schließlich darin, die aktuelle Sitzung zu verwenden, ohne eine neue Sitzung zu erstellen:
Global.MySession = ApplicationEngine.GetSession(mandant.ParentSession.Id).
 
Oben