| 

.NET C# Java Javascript Exception

2
Hallo zusammen,

ich suche verzweifelt eine Antwort/Lösung zu folgendem Problem:

Im Rahmen einer asp.net Anwendung führe ich einen Download eines PDF vom Reporting Service durch, indem ich die entsprechend vorbereitete URL per Webclient Class aufrufe.

byte[] pdfReport;
System.Net.WebClient wc = new System.Net.WebClient();
wc.Credentials = System.Net.CredentialCache.DefaultCredentials;
//wc.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
pdfReport = wc.DownloadData(TextBox1.Text);


Beim lokalen Debuggen des Projekts funktioniert dies einwandfrei.

Nachdem deployen funktioniert es nicht. In der Kundenumgebung erhalte ich immer den http Status 401:

System.Net.WebException: The remote server returned an error: (401)
Unauthorized at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
at System.Net.WebClient.DownloadData(Uri address) at
System.Net.WebClient.DownloadData(String address)


Der Verdacht liegt auf irgendwelchen Rechten, kann mir aber nicht genau erklären wo. Beim Kunden ist ein Proxyserver in den Browsereinstelungen zu hinterlegen, möglicherweise spielt auch das eine Rolle. Ich habe verschiedenste Varianten probiert:
1. Übergabe mit DefaultCredentials
2. Übergabe mit DefaultNetworkCredentials
3. Übergabe eines Webproxy

wc.Credentials = System.Net.CredentialCache.DefaultCredentials;
wc.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;


optional:
WebProxy p = null
p = new WebProxy(proxyAddressAndPort true, null, cred);
//cred = new NetworkCredential(proxyUserName, proxyPassword);
cred = System.Net.CredentialCache.DefaultNetworkCredentials;
WebRequest.DefaultWebProxy = p;

Aber egal was ich versuche, ich lande immer im 401.
Die Webseite liefert mit für die Werte LOGON_USER, REMOTE_USER und AUTH_USER in den Request.ServerVariables überall meinen Benutzer und meine Domäne, d.h. der Prozess läuft offenbar mit meinem Benutzer, der die gleiche Datei/Report über direkte URL Eingabe problemlos aufrufen kann.

Diverse google Treffer helfen mir leider nicht weiter, alles spekulative Vorschläge, teilweise ist auch von einem Fehler in der Klasse Webclient die Rede.

Was tun?

Danke & Gruß
Markus
14.03.2011
Magier77 238 1 6
Floyd 14,6k 3 9
Edit: Retagged
Floyd 14.03.2011
4 Antworten
2
"Was tun" - zusammen mit dem Kunden herausfinden, von welchem System (Proxy oder gerufener Server) Dein Aufruf abgelehnt wird, und nach welchen Kriterien dieses System den Zugang erlaubt (mal ins Blaue spekuliert: vielleicht war jemand leicht paranoid und checkt auch noch den user agent header des Requests, oder die PCs und Dein Webserver liegen in verschiedenen Netzen, und der Zugriff ist auf das PC-Netz eingeschränkt?). Mit diesen Infos kannst Du zielgerichteter nach einer Lösung suchen, als alle Varianten durchzuprobieren.

Wenn Du das Tool Fiddler auf dem Webserver installieren darfst, könnte Dir das außerdem helfen zu sehen, was tatsächlich über die Leitung geht. Ein Ansatz wäre auch noch, ein solches Log mit dem Aufruf der Datei über den Browser zu vergleichen.
14.03.2011
Matthias Hlawatsch 13,2k 4 9
1
Versuchs mal mit folgender Funktion:

Trag mal den Proxy in die app.config ein:

<system.net>
<defaultProxy>
<proxy proxyaddress="http://proxy:8080/"
bypassonlocal="true" />
</defaultProxy>
</system.net>


Sollte das nicht ausreichen, versuch mal zusätzlich diesen Code zu verwenden:

// Remember to add the following using statements to your code
// using System.Net;
// using System.IO;

public static int DownloadFile(String remoteFilename,
String localFilename)
{
// Function will return the number of bytes processed
// to the caller. Initialize to 0 here.
int bytesProcessed = 0;

// Assign values to these objects here so that they can
// be referenced in the finally block
Stream remoteStream = null;
Stream localStream = null;
WebResponse response = null;

// Use a try/catch/finally block as both the WebRequest and Stream
// classes throw exceptions upon error
try
{
// Create a request for the specified remote file name
WebRequest request = WebRequest.Create(remoteFilename);
if (request != null)
{
// Send the request to the server and retrieve the
// WebResponse object
response = request.GetResponse();
if (response != null)
{
// Once the WebResponse object has been retrieved,
// get the stream object associated with the response's data
remoteStream = response.GetResponseStream();

// Create the local file
localStream = File.Create(localFilename);

// Allocate a 1k buffer
byte[] buffer = new byte[1024];
int bytesRead;

// Simple do/while loop to read from stream until
// no bytes are returned
do
{
// Read data (up to 1k) from the stream
bytesRead = remoteStream.Read (buffer, 0, buffer.Length);

// Write the data to the local file
localStream.Write (buffer, 0, bytesRead);

// Increment total bytes processed
bytesProcessed += bytesRead;
} while (bytesRead > 0);
}
}
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
// Close the response and streams objects here
// to make sure they're closed even if an exception
// is thrown at some point
if (response != null) response.Close();
if (remoteStream != null) remoteStream.Close();
if (localStream != null) localStream.Close();
}

// Return total bytes processed to caller.
return bytesProcessed;
}

//Quelle: http://www.codeguru.com/columns/dotnettips/article.php/c7005


Sollte auch das nicht funktionieren, nimm Wireshark und vergleiche einmal die Anfragen.
14.03.2011
Floyd 14,6k 3 9
0
Danke erstmal.
@Floyd: Ich habe keine app.config, wo finde/erstelle ich diese? Habe nur eine web.config, die den Eintrag defaultproxy aber nicht zu kennen scheint.
14.03.2011
Magier77 238 1 6
Die web.config funktioniert auch. Dann musst du das ganze unter <configuration> einfügen. Näher Informationen hierzu incl. Beispiel: http://msdn.microsoft.com/en-us/library/kd3cf2ex.aspx
Floyd 14.03.2011
0
Danke für Eure Unterstützung.
Es funktioniert inzwischen, ganz einfach per:
byte[] pdfReport;
System.Net.WebClient wc = new System.Net.WebClient();
wc.Credentials = System.Net.CredentialCache.DefaultCredentials;
//wc.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
pdfReport = wc.DownloadData(TextBox1.Text);


Und zwar mit beiden Varianten. Meine TESTS liefen auf eine andere, einfachere URL, irgendein Dokument im Intranet, welches offenbar wegen Proxy Konfiguration diesen Zugriff nicht erlaubte. Unter Einbeziehung der Security Leute konnten wir es entsprechend ausloten.
17.03.2011
Magier77 238 1 6

Stelle deine .net-Frage jetzt!