2013-05-24 19 views
20

Ich habe eine App geschrieben, die seit Monaten funktioniert, in den letzten Tagen habe ich den Fehler unten nur auf der installierten Version erhalten.Der Remote-Server hat einen Fehler zurückgegeben: (403) Forbidden

Wenn ich den Quellcode in VS ausführen, funktioniert alles gut. Außerdem funktioniert die .exe in den Ordnern der Bin einwandfrei. Es ist nur die installierte Version, die den Fehler erzeugt, wenn ich neu kompiliere und neu installiere, bekomme ich den gleichen Fehler.

Ich bin ein bisschen ratlos, was das verursacht und hoffte auf ein paar Hinweise. Es scheint eine WebRequest-Antwort durch IE zu sein wird nicht zurückgegeben, aber ich bin ratlos, warum es gut in VS ohne Fehler funktioniert. Gibt es neue IE Sicherheitsmaßnahmen/Richtlinien, die dies verursachen können?

Dinge, die ich habe versucht, so weit sind:

  • Disabled alle Antivirus & Firewall
  • Als Administrator ausführen

Die Ausnahme:

Exception: System.Windows.Markup.XamlParseException: The invocation of the constructor on type 'XApp.MainWindow' that matches the specified binding constraints threw an exception. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden. 
    at System.Net.HttpWebRequest.GetResponse() 
    at XApp.HtmlRequest.getHtml(Uri uri) in J:\Path\MainWindow.xaml.cs:line 3759 
    at XApp.MainWindow.GetLinks() in J:\Path\MainWindow.xaml.cs:line 2454 
    at XApp.MainWindow..ctor() in J:\Path\MainWindow.xaml.cs:line 124 
    --- End of inner exception stack trace --- 
    at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 
    at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) 
    at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) 
    at System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc) 
    at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties) 
    at System.Windows.Application.DoStartup() 
    at System.Windows.Application.<.ctor>b__1(Object unused) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
Exception: System.Net.WebException: The remote server returned an error: (403) Forbidden. 
    at System.Net.HttpWebRequest.GetResponse() 
    at XApp.HtmlRequest.getHtml(Uri uri) in J:\Path\MainWindow.xaml.cs:line 3759 
    at XApp.MainWindow.GetLinks() in J:\Path\MainWindow.xaml.cs:line 2454 
    at XApp.MainWindow..ctor() in J:\Path\MainWindow.xaml.cs:line 124 

EDIT:

Dies wird als eigenständige App installiert. Wenn ich als Administrator ausgeführt habe, habe ich den Programmordner geöffnet und führe die Exe als Administrator und nicht als Verknüpfung aus.

Der Code, der das Problem verursacht, ist dies

private void GetLinks() 
{ 
    //Navigate to front page to Set cookies 
    HtmlRequest htmlReq = new HtmlRequest(); 

    OLinks = new Dictionary<string, List<string>>(); 

    string Url = "http://www.somesite.com/somepage"; 
    CookieContainer cookieJar = new CookieContainer(); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); 
    request.CookieContainer = cookieJar; 

    request.Accept = @"text/html, application/xhtml+xml, */*"; 
    request.Referer = @"http://www.somesite.com/"; 
    request.Headers.Add("Accept-Language", "en-GB"); 
    request.UserAgent = @"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)"; 
    request.Host = @"www.somesite.com"; 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    String htmlString; 
    using (var reader = new StreamReader(response.GetResponseStream())) 
    { 
     htmlString = reader.ReadToEnd(); 
    } 

    //More Code 


} 
+1

Vor allem, was ist Ihr Code? Dann, wenn ich Sie wäre, würde ich versuchen, die HTTP-Nachrichten mit Fiddler zu überwachen und funktionierende und nicht funktionierende Anfragen zu vergleichen. –

+1

Wie starten Sie Ihre "installierte Version" - als Dienst oder ist es eine normale Konsole/Desktop-Anwendung? Sie sollten versuchen zu überprüfen, unter welchem ​​Benutzerkontext die Anwendung ausgeführt wird. Können Sie genauer ausführen, was Sie getan haben, um Ihre Anwendung als Administrator auszuführen? Bitte geben Sie ein wenig mehr Details über Ihre Anwendungsarchitektur - welche Verbindungen hergestellt sind. Ist das ein Server oder ein Client? – Marcus

Antwort

14

Fügen Sie die folgende Zeile ein:

request.UseDefaultCredentials = true; 

Dies wird die Anwendung lassen die Anmeldeinformationen des angemeldeten Benutzers verwenden, um die Website zuzugreifen. Wenn es 403 zurückgibt, erwartet es eindeutig eine Authentifizierung.

Es ist auch möglich, dass Sie (jetzt?) Einen authentifizierenden Proxy zwischen Ihnen und der Gegenstelle haben. In diesem Fall versuchen:

request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 

Hoffnung, das hilft.

+0

Entschuldigung für die Verzögerung, die ich gerade getestet habe. Dein erster Vorschlag hat das Problem gelöst. Vielen Dank! – user3357963

+0

Funktioniert nicht ... –

2

Es ist ein Berechtigungsfehler. Ihr VS wird wahrscheinlich mit einem erhöhten Konto oder einem anderen Benutzerkonto als dem Benutzer ausgeführt, der die installierte Version verwendet.

Es kann nützlich sein, Ihre IIS-Berechtigungen zu überprüfen und festzustellen, welche Konten Zugriff auf die Ressource haben, auf die Sie zugreifen. Querverweis auf das Konto, das Sie verwenden, und auf das Konto, das von den installierten Versionen verwendet wird.

+0

Sie sagen, sie haben versucht, als Administrator zu laufen. –

+0

Hat das Admin-Konto die Berechtigung, dass der Webserver die Anfrage erhält? Beachten Sie, dass MyLocalPC \ Administrator und Server \ Administrator nicht dasselbe Konto sind. – James

13

Sieht aus wie Problem auf einer Serverseite basiert.

Im meinem Fall habe ich mit paypal Server und weder die vorgeschlagenen Antworten geholfen, aber http://forums.iis.net/t/1217360.aspx?HTTP+403+Forbidden+error

I was facing this issue and just got the reply from Paypal technical. Add this will fix the 403 issue. HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.UserAgent = "[any words that is more than 5 characters]";

+0

Dies war die Lösung für das Problem "Verboten", das bei der Verwendung der GitHub-API aufgetreten ist. Es dauerte mehrere Stunden, bis ich über diesen Posten stolperte. –

+1

. UserAgent war es für mich auf einem Produktionsserver. Ich denke, ich muss IIS gesetzt haben, um Anfragen zu verbieten, ohne dass ein Agent angegeben wurde. – secretwep

+0

dito Spotify ATOM-Feeds – planetClaire

0
private class GoogleShortenedURLResponse 
    { 
     public string id { get; set; } 
     public string kind { get; set; } 
     public string longUrl { get; set; } 
    } 

    private class GoogleShortenedURLRequest 
    { 
     public string longUrl { get; set; } 
    } 

    public ActionResult Index1() 
    { 
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult ShortenURL(string longurl) 
    { 
     string googReturnedJson = string.Empty; 
     JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer(); 

     GoogleShortenedURLRequest googSentJson = new GoogleShortenedURLRequest(); 
     googSentJson.longUrl = longurl; 
     string jsonData = javascriptSerializer.Serialize(googSentJson); 

     byte[] bytebuffer = Encoding.UTF8.GetBytes(jsonData); 

     WebRequest webreq = WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url"); 
     webreq.Method = WebRequestMethods.Http.Post; 
     webreq.ContentLength = bytebuffer.Length; 
     webreq.ContentType = "application/json"; 

     using (Stream stream = webreq.GetRequestStream()) 
     { 
      stream.Write(bytebuffer, 0, bytebuffer.Length); 
      stream.Close(); 
     } 

     using (HttpWebResponse webresp = (HttpWebResponse)webreq.GetResponse()) 
     { 
      using (Stream dataStream = webresp.GetResponseStream()) 
      { 
       using (StreamReader reader = new StreamReader(dataStream)) 
       { 
        googReturnedJson = reader.ReadToEnd(); 
       } 
      } 
     } 

     //GoogleShortenedURLResponse googUrl = javascriptSerializer.Deserialize<googleshortenedurlresponse>(googReturnedJson); 

     //ViewBag.ShortenedUrl = googUrl.id; 
     return View(); 
    } 
+3

geben Sie keine Antwort ohne eine Erklärung. Bitte erläutern Sie, was Sie empfehlen. Dies ist ein großer Codeblock, der die Frage möglicherweise beantwortet, aber mit einigen Details gepaart werden sollte. –

0

Dies wird wahrscheinlich nicht allzu viele Menschen helfen, aber das war mein Fall: Ich war mit die Jira Rest Api und benutzte meine persönlichen Zugangsdaten (diejenigen, mit denen ich mich bei Jira anmeldete). Ich hatte mein Jira-Passwort aktualisiert, aber vergessen, es in meinem Code zu aktualisieren.Ich habe den 403-Fehler erhalten. Ich habe versucht, mein Passwort im Code zu aktualisieren, aber es ist immer noch der Fehler aufgetreten.

Die Lösung: Ich habe versucht, mich in Jira einzuloggen (von ihrer Login-Seite) und ich musste den Text eingeben, um zu beweisen, dass ich kein Bot war. Danach habe ich es nochmal ausprobiert und es funktionierte. Imbiss: Der Server hat Sie möglicherweise ausgesperrt.

0

In meinem Fall erinnerte ich mich, dass ein Loch in der Firewall vor einiger Zeit für diese Adresse erstellt wurde, so hatte ich useDefaultWebProxy = „false“ auf der Bindung in der Konfigurationsdatei zu setzen, als ob der Standard die verwenden war Proxy, wenn useDefaultWebProxy nicht angegeben ist.

0

Rahmen:

request.Referer = @"http://www.somesite.com/"; 

und das Hinzufügen von cookies als für mich gearbeitet

0

Wir Zugriff auf die Website sollte den Namen im Zertifikat angegeben werden. enter image description here

Verwandte Themen