MVC-web-api: er is geen ‘Access-Control-Allow-Origin’-header aanwezig op de gevraagde bron

Ik heb alles geprobeerd wat in dit artikel staat: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api, maar niets werkt.
Ik probeer gegevens van webAPI2 (MVC5) te krijgen voor gebruik in een ander domein met behulp van angularJS.

mijn controller ziet er zo uit:

namespace tapuzWebAPI.Controllers
{
    [EnableCors(origins: "http://local.tapuz.co.il", headers: "*", methods: "*", SupportsCredentials = true)]
    [RoutePrefix("api/homepage")]
    public class HomePageController : ApiController
    {
        [HttpGet]
        [Route("GetMainItems")]
        //[ResponseType(typeof(Product))]
        public List<usp_MobileSelectTopSecondaryItemsByCategoryResult> GetMainItems()
        {
            HomePageDALcs dal = new HomePageDALcs();
            //Three product added to display the data
            //HomePagePromotedItems.Value.Add(new HomePagePromotedItem.Value.FirstOrDefault((p) => p.ID == id));
            List<usp_MobileSelectTopSecondaryItemsByCategoryResult> items = dal.MobileSelectTopSecondaryItemsByCategory(3, 5);
            return items;
        }      
    }
}

Antwoord 1, autoriteit 100%

U moet CORSinschakelen in uw Web Api. De gemakkelijkere en geprefereerde manier om CORS wereldwijd in te schakelen, is door het volgende toe te voegen aan web.config

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

Houd er rekening mee dat de Methodenallemaal afzonderlijk worden gespecificeerd, in plaats van *te gebruiken. Dit komt omdat er een fout optreedt bij het gebruik van *.

Je kunt CORSook met code inschakelen.

Bijwerken
Het volgende NuGet-pakket is vereist: Microsoft.AspNet.WebApi.Cors.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.EnableCors();
        // ...
    }
}

Vervolgens kunt u het kenmerk [EnableCors]gebruiken voor acties of controllers zoals deze

[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]

Of u kunt het wereldwijd registreren

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("http://www.example.com", "*", "*");
        config.EnableCors(cors);
        // ...
    }
}

U moet ook de preflight OPTIONSverzoekenafhandelen met HTTP OPTIONS-verzoeken.

Web APImoet reageren op het verzoek OPTIONSom te bevestigen dat het inderdaad is geconfigureerd om CORSte ondersteunen.

Om dit aan te pakken, hoef je alleen maar een leeg antwoordterug te sturen. Je kunt dit doen binnen je acties, of je kunt het globaal als volgt doen:

# Global.asax.cs
protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        Response.Flush();
    }
}

Deze extra controle is toegevoegd om ervoor te zorgen dat oude APIsdie zijn ontworpen om alleen GET– en POST-verzoeken te accepteren, niet worden misbruikt. Stel je voor dat je een DELETE-verzoek stuurt naar een APIdie is ontworpen toen dit werkwoordniet bestond. De uitkomst is onvoorspelbaaren de resultaten kunnen gevaarlijkzijn.


Antwoord 2, autoriteit 9%

@Mihai-Andrei Dinculescu’s antwoord is correct, maar in het voordeel van zoekers is er ook een subtiel punt dat deze fout kan veroorzaken.

Als u een ‘/’ aan het einde van uw URL toevoegt, werkt EnableCors in alle gevallen niet meer (bijv. vanaf de startpagina).

D.w.z. Dit werkt niet

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net/", "*", "*");
config.EnableCors(cors);

maar dit zal werken:

var cors = new EnableCorsAttribute("http://testing.azurewebsites.net", "*", "*");
config.EnableCors(cors);

Het effect is hetzelfde als u het EnableCors-kenmerk gebruikt.


Antwoord 3, autoriteit 8%

Ik heb alle bovenstaande stappen gevolgd die zijn aangegeven door Mihai-Andrei Dinculescu.
Maar in mijn geval had ik 1 extrastap nodig omdat http OPTIONS was uitgeschakeld in de Web.Config door de onderstaande regel.

<remove name="OPTIONSVerbHandler" />

Ik heb het zojuist uit Web.Config verwijderd (commentaar zoals hieronder) en Cors werkt als een tierelier

<handlers>
  <!-- remove name="OPTIONSVerbHandler" / -->
</handlers>

Antwoord 4, autoriteit 3%

Het kan zijn vanwege de installatie van Cors-nugetpakketten.

Als u het probleem ondervindt nadat u cors van nuget hebt geïnstalleerd en ingeschakeld, kunt u proberen de web-API opnieuw te installeren.

Voer vanuit de pakketbeheerder Update-Package Microsoft.AspNet.WebApi -reinstall

uit


Antwoord 5, autoriteit 2%

Probeer dit om er zeker van te zijn dat je CORS correct hebt geconfigureerd:

[EnableCors(origins: "*", headers: "*", methods: "*")]

Werkt het nog steeds niet? Controleer de aanwezigheid van HTTP-headers.


Antwoord 6, autoriteit 2%

Ik weet dat ik hier heel laat aan kom. Maar voor iedereen die op zoek is, dacht ik dat ik zou publiceren wat EINDELIJK voor mij werkte. Ik beweer niet dat het de beste oplossing is – alleen dat het werkte.

Onze WebApi-service gebruikt de methode config.EnableCors(corsAttribute). Maar zelfs dan zou het nog steeds mislukken op de pre-flight-verzoeken. Het antwoord van @Mihai-Andrei Dinculescu gaf mij de aanwijzing. Allereerst heb ik zijn Application_BeginRequest()-code toegevoegd om de optieverzoeken te wissen. Dat werkte NOG STEEDS niet voor mij. Het probleem is dat WebAPI nog steeds geen van de verwachte headers aan het OPTIONS-verzoek toevoegde. Alleen doorspoelen werkte niet, maar het bracht me op een idee. Ik heb de aangepaste headers toegevoegd die anders via de web.config zouden worden toegevoegd aan het antwoord op het OPTIONS-verzoek. Hier is mijn code:

protected void Application_BeginRequest()
{
  if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
  {
    Response.Headers.Add("Access-Control-Allow-Origin", "https://localhost:44343");
    Response.Headers.Add("Access-Control-Allow-Headers",
      "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    Response.Flush();
  }
}

Dit is uiteraard alleen van toepassing op de OPTIONS-verzoeken. Alle andere werkwoorden worden afgehandeld door de CORS-configuratie. Als er een betere aanpak is, ben ik een en al oor. Het voelt als een cheat voor mij en ik zou liever hebben dat de headers automatisch werden toegevoegd, maar dit is wat uiteindelijk werkte en me in staat stelde verder te gaan.


Antwoord 7

Om een ​​CORS-protocol te laten werken, moet u op elk eindpunt een OPTIONS-methode hebben (of een globaal filter met deze methode) die deze headers retourneert:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: content-type

De reden is dat de browser eerst een OPTIONS-verzoek stuurt om uw server te ‘testen’ en de autorisaties te bekijken


Antwoord 8

Ik zie de volgende zaak over cors. Misschien is het nuttig voor iemand.
Als u de functie ‘WebDav Redirector’ aan uw server toevoegt, worden PUT- en DELETE-verzoeken mislukt.

Dus u moet ‘WebDAVModule’ van uw IIS-server verwijderen:

  • “In de configuratie van de IIS-modules zet u de WebDAV-module in een lus, als uw webserver deze heeft, verwijder deze dan”.

Of voeg toe aan uw configuratie:

<system.webServer>
<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  ...
</handlers>


Antwoord 9

Dat probleem treedt op wanneer u probeert toegang te krijgen vanaf een ander domein of een andere poort.

Als u Visual Studio gebruikt, ga dan naar Extra > NuGet-pakketbeheerder > Pakketbeheerconsole. Daar moet je het NuGet-pakket Microsoft.AspNet.WebApi.Cors

Install-Package Microsoft.AspNet.WebApi.Cors

Vervolgens, in PROJECT > App_Start > WebApiConfig, CORS inschakelen

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //Enable CORS. Note that the domain doesn't have / in the end.
        config.EnableCors(new EnableCorsAttribute("https://tiagoperes.eu",headers:"*",methods:"*"));
        ....
    }
}

Eenmaal succesvol geïnstalleerd, bouw de oplossing en dat zou voldoende moeten zijn


Antwoord 10

@Mihai-Andrei Dinculescu’s antwoord werkte voor mij, bijvoorbeeld:

  • Een <httpProtocol>toevoegen in de <system.webServer>sectie van web.config
  • Leeg antwoord retourneren voor OPTIONS-verzoeken via de genoemde Application_BeginRequest()in global.asax

Behalve dat zijn controle op Request.Headers.AllKeys.Contains("Origin")NIET werkte voor mij, omdat het verzoek een origingbevatte, dus met kleine letters . Ik denk dat mijn browser (Chrome) het zo verzendt voor CORS-verzoeken.

Ik heb dit wat algemener opgelost door een hoofdletterongevoeligevariant van zijn Containscontroleer in plaats daarvan:

if (culture.CompareInfo.IndexOf(string.Join(",", Request.Headers.AllKeys), "Origin", CompareOptions.IgnoreCase) >= 0) {


Antwoord 11

Als je security\requestFiltering nodes als volgt in je web.config hebt:

<security>
  <requestFiltering>
    <verbs allowUnlisted="false">
      <add verb="GET" allowed="true" />
      <add verb="POST" allowed="true" />
      <add verb="PUT" allowed="true" />
      <add verb="DELETE" allowed="true" />
      <add verb="DEBUG" allowed="true" />          
    </verbs>
  </requestFiltering>

zorg ervoor dat je dit ook toevoegt

<add verb="OPTIONS" allowed="true" />

Antwoord 12

Ik had alles geprobeerd wat ik op het net kon vinden, inclusief de methoden die op dit antwoord zijn gegeven.
Na bijna de hele dag geprobeerd te hebben het probleem op te lossen, heb ik de oplossing gevonden die voor mij als een zonnetje heeft gewerkt.

in het bestand WebApiConfigin de map App_Start, becommentarieer alle regels code en voeg de volgende code toe:

`public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.EnableCors();
        var enableCorsAttribute = new EnableCorsAttribute("*",
                                           "Origin, Content-Type, Accept",
                                           "GET, PUT, POST, DELETE, OPTIONS");
        config.EnableCors(enableCorsAttribute);
        // Web API routes
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            //routeTemplate: "api/{controller}/{id}",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.Formatters.Add(new BrowserJsonFormatter());
    }
    public class BrowserJsonFormatter : JsonMediaTypeFormatter
    {
        public BrowserJsonFormatter()
        {
            this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
            this.SerializerSettings.Formatting = Formatting.Indented;
        }
        public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
        {
            base.SetDefaultContentHeaders(type, headers, mediaType);
            headers.ContentType = new MediaTypeHeaderValue("application/json");
        }
    }`

Antwoord 13

Ik weet dat mensen dit in het begin waarschijnlijk heel duidelijk zullen vinden, maar denk hier echt over na. Dit kan vaak gebeuren als je iets verkeerd hebt gedaan.

Ik heb dit probleem bijvoorbeeld gehad omdat ik geen hostitem aan mijn hosts-bestand heb toegevoegd. Het echte probleem was de DNS-resolutie. Of ik heb gewoon de basis-URL verkeerd.

Soms krijg ik deze foutmelding als het identiteitstoken van de ene server komt, maar ik probeer het op een andere te gebruiken.

Soms krijg je deze foutmelding als je de bron verkeerd hebt gebruikt.

U kunt dit krijgen als u de CORS-middleware te laat in de keten plaatst.


Antwoord 14

Vermijd meerdere plaatsen die CORS inschakelen, zoals WebApiCOnfig.cs, GrantResourceOwnerCredentials-methode in provider en Controller Header-attribuut enz.
Hieronder vindt u de lijst die ook de Access Control Origin toestaan

  1. Web heeft problemen met interactie met DB die je hebt gebruikt.
  2. AWS Cloud Als VPC van Web API en DB verschillend zijn.

Onderstaande code is meer dan genoeg om de toegangscontrole toe te staan.
//Zorg ervoor dat app.UseCors bovenaan de coderegel van configuratie moet staan.

  public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
            //All other configurations
        }
    }

Dit vertraagde mijn probleem.


Antwoord 15

Installeer pakket: Microsoft.AspNet.WebApi.Cors

ga naar: App_Start –> WebApiConfig

Toevoegen:

var cors = new EnableCorsAttribute(“http://localhost:4200”, ““, ““);
config.EnableCors(cors);

Opmerking: als u ‘/’ toevoegt aan het einde van de specifieke url werkte niet voor mij.


Antwoord 16

Voor mensen die gewoon een web-API maken in .NET 5 en geen web-app, moet u in Startup.csuw beleid als volgt configureren:

public void ConfigureServices(IServiceCollection services)
{
    // Additional configs above...
    services.AddCors(options =>
    {
        options.AddPolicy("AllowAnyOrigin", builder =>
        {
            // Allow "Access-Control-Allow-Origin: *" header
            builder.AllowAnyOrigin();
        });
    });
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // Add this above other config options...
    app.UseCors("AllowAnyOrigin");
}

Other episodes