2009-11-05 2 views
7

Ich versuche, HTTPWebRequest verwenden, um auf einen Webdienst zuzugreifen, und habe Probleme beim Übergeben von Anmeldeinformationen, siehe Code unten. Ich kann das credentials-Objekt, nc, sehen, das im Debugger und auch in der Zuweisung zum Anfordern gebaut wird.Kreditoren, aber wenn ich zur letzten Codezeile komme, stört es mit einer nicht autorisierten Fehlermeldung. Ich habe unsere Server-Leute haben die Anfrage auf dem Server zu beobachten, und es gibt keine Anmeldeinformationen übergeben. Mache ich etwas falsch mit dem Credentials-Objekt, oder muss ich etwas tun, was ich hier nicht mache?Übergabe von NetworkCredential an HttpWebRequest in C# von ASP.Net Seite

Uri requestUri = null; 
Uri.TryCreate("https://mywebserver/webpage"), 
    UriKind.Absolute, out requestUri); 

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create 
    (requestUri); 

NetworkCredential nc = 
    new NetworkCredential("user", "password"); 

request.Credentials = nc; 

request.Method = WebRequestMethods.Http.Get; 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
+3

Haben Sie Fiddler benutzt, um selbst zu sehen, was Sie passieren? Ich mag es nicht, sich auf Server-Leute zu verlassen, um solche Dinge zu bewerten :) – JustLoren

+0

JustLoren - Ich wusste nichts über Fiddler, bis Sie diesen Kommentar gepostet haben, ich habe ihn heruntergeladen und unter der Registerkarte Auth steht Kein Proxy-Autorisierungs-Header. Es ist kein Autorisierungs-Header vorhanden, daher denke ich, dass mit meinem Code etwas nicht stimmt. –

+0

Gibt es einen Grund, warum Sie keine Proxy-Klasse generieren, um einen internen Web-Service aufzurufen? – kd7

Antwort

1

Microsoft Premier Support schließlich half mir, dieses Problem zu lösen, indem die CredentialCache Klasse mit den Anmeldeinformationen und die „Basic“ Berechtigung hinzufügen:

NetworkCredential nc = 
    new NetworkCredential(GetSetting("username"), GetSetting("password")); 
CredentialCache cache = new CredentialCache(); 

cache.Add(requestUri, "Basic", nc); 

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
+0

ohne ss l, wird das Passwort im Klartext übertragen? –

12

Die NetworkCredentials sind entweder extrem nicht-intuitiv, oder flockige , oder beides. Unabhängig davon, können Sie das Problem lösen, indem NetworkCredentials zusammen und verwenden diese Methode (die ich gefunden, mit freundlicher Genehmigung von mark.michaelis.net)

/* http://mark.michaelis.net/Blog/CallingWebServicesUsingBasicAuthentication.aspx */ 
byte[] credentialBuffer = new UTF8Encoding().GetBytes(username + ":" +password); 
req.Headers["Authorization"] ="Basic " + Convert.ToBase64String(credentialBuffer); 

So umgehen, was Sie tun manuell einen Header zu schaffen für Ihre HttpWebRequest und Einfügen des Inhalts so, wie er in einem Basisauthentifizierungsheader erscheinen würde. Klappt wunderbar.

+1

Ausgezeichnet, dieser hat funktioniert, die angenommene Antwort hat nicht für mich funktioniert. –