De externe server heeft een fout geretourneerd: (403) Verboden

Ik heb een app geschreven die al maanden prima heeft gewerkt, in de afgelopen dagen krijg ik de fout hieronder op de geïnstalleerde versie.

Als ik de broncode in vs voer, werkt alles goed. Ook werkt de .exe in de bakmappen prima. Het is alleen de geïnstalleerde versie die de fout genereert, als ik opnieuw compileer en installeer ik dezelfde foutmelding.

Ik ben een beetje gestokend over wat dit veroorzaakt en hoopte op een paar aanwijzingen. Het lijkt een wezyrequest reactie door IE wordt niet geretourneerd, maar ik ben stumped waarom het prima werkt in vs zonder fouten. Zijn er nieuwe dwz beveiligingsmaatregelen / -beleid die dit kunnen veroorzaken?

Dingen die ik tot nu toe heb geprobeerd, zijn:

  • uitgeschakeld alle antivirus en amp; Firewall
  • Run als beheerder

De uitzondering:

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

BEWERKEN:

Dit is geïnstalleerd als een zelfstandige app. Wanneer ik als beheerder heb uitgevoerd, heb ik de programmamap geopend en de exe uitgevoerd als beheerder in plaats van de snelkoppeling.

De code die het probleem veroorzaakt is deze

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
 }

Antwoord 1, Autoriteit 100%

Voeg de volgende regel toe:

request.UseDefaultCredentials = true;

Hiermee wordt de aanvraag de inloggegevens van de ingelogde gebruiker gebruikt om toegang te krijgen tot de site. Als het 403 retourneert, verwacht het duidelijk dat authenticatie.

Het is ook mogelijk dat u (nu?) een authenticerende proxy tussen u en de externe site heeft. Probeer in welk geval:

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

Ik hoop dat dit helpt.


Antwoord 2, Autoriteit 95%

Lijkt erop dat het probleem is gebaseerd op een serverzijde.

Ik heb mijn zaak met PayPal-server gewerkt en geen van beide voorgestelde antwoorden hielp, maar http://forums.iis.net/t/1217360.aspx?http+403+forbidden+Error

Ik had geconfronteerd met dit probleem en kreeg net het antwoord van PayPal Technical.
Toevoegen Hiermee worden de 403-probleem opgelost.
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.UserAgent = "[any words that is more than 5 characters]";


Antwoord 3, autoriteit 14%

Het is een machtigingsfout. Uw VS werkt waarschijnlijk met een verhoogd account of een ander gebruikersaccount dan de gebruiker die de geïnstalleerde versie gebruikt.

Het kan handig zijn om uw IIS-machtigingen te controleren en te zien welke accounts toegang hebben tot de bron die u gebruikt. Verwijs dat naar het account dat u gebruikt en het account dat de geïnstalleerde versies gebruiken.


Antwoord 4, autoriteit 9%

We moeten toegang krijgen tot de website met de naam die in het certificaat wordt gegeven.


Antwoord 5

   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();
    }

Antwoord 6

Dit zal waarschijnlijk niet veel mensen helpen, maar dit was mijn geval: ik gebruikte de Jira Rest Api en gebruikte mijn persoonlijke inloggegevens (degene die ik gebruik om in te loggen bij Jira). Ik had mijn Jira-wachtwoord bijgewerkt, maar vergat ze in mijn code bij te werken. Ik kreeg de 403-fout, ik probeerde mijn wachtwoord in de code bij te werken, maar kreeg nog steeds de fout.

De oplossing: ik probeerde in te loggen op Jira (vanaf hun inlogpagina) en ik moest de tekst invoeren om te bewijzen dat ik geen bot was. Daarna probeerde ik het opnieuw met de code en het werkte. Afhaalmaaltijden: de server heeft je mogelijk buitengesloten.


Antwoord 7

In mijn geval herinnerde ik me dat er enige tijd geleden een gat in de firewall was gemaakt voor dit adres, dus ik moest useDefaultWebProxy=”false” instellen op de binding in het configuratiebestand, alsof het standaard was om de proxy te gebruiken als useDefaultWebProxy niet is opgegeven.


Antwoord 8

Instelling:

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

en het toevoegen van cookieswerkte voor mij


Antwoord 9

In mijn geval moest ik herhaaldelijk een API aanroepen in een lus, wat ertoe leidde dat mijn systeem een 403 Forbidden Errorretourneerde. Aangezien mijn API-provider niet meerdere verzoeken van dezelfde client binnen milliseconden toestaat, moest ik een vertraging van minimaal 1 seconde gebruiken:

foreach (var it in list)
{
    Thread.Sleep(1000);
    // Call API
}

Antwoord 10

In mijn geval moest ik zowel ‘user agent’ als ‘default references = True’ toevoegen. Ik weet dat dit best oud is, wilde het toch even delen. Ik hoop dat dit helpt. Onderstaande code is in powershell, maar het zou anderen moeten helpen die c# gebruiken.

[System.Net.HttpWebRequest] $req = [System.Net.HttpWebRequest]::Create($uri)
$req.UserAgent = "BlackHole"
$req.UseDefaultCredentials = $true

Other episodes