2014-11-30 21 views
31

Ich habe ein MVC-Projekt, in dem ich ein paar JSON-Controller-Methoden habe, die ich domänenübergreifend verfügbar machen möchte. Nicht die gesamte Website, nur diese beiden Methoden.CORS in ASP .NET MVC5

Ich mag im Grunde auf die genaue Sache in diesem Beitrag für cors erklärte:

http://enable-cors.org/server_aspnet.html

jedoch das Problem ist, dass ich ein reguläres MVC-Projekt habe und nicht einen Web-API, das heißt, dass ich kann nicht folgen die Schritte in Bezug auf das Register

Methode, da es nicht in meinem MVC-Projekt vorhanden ist.

Gibt es eine Möglichkeit, diese Bibliothek zu verwenden, obwohl es sich um ein MVC-Projekt handelt?

Ich bin mir dessen bewusst, dass ich dies durch web.config Config kann mit:

<httpProtocol> 
     <customHeaders> 
     <clear /> 
     <add name="Access-Control-Allow-Origin" value="http://www.domain.com" /> 
     </customHeaders> 
</httpProtocol> 

Aber ich will nicht alle Methoden aufzudecken, und ich möchte mehr als eine Domäne (2 Domänen angeben Zugriff auf meine Methoden) haben ...

+2

möglich Duplikat [Festlegen von Zugriffs-Control-Allow-Origin in ASP.Net MVC - möglichst einfache Methode] (http://stackoverflow.com/questions/6290053/setting-access-control-allow-origin -in-asp-net-mvc-einfachste-möglich-Methode) –

+0

Ja, habe ich gesehen, dass, aber das ist im Grunde das gleiche wie das hinzufügen Das einzige Problem ist, dass ich 2-Domänen angeben möchten, die den Zugriff auf meine json Service haben, nicht nur alle (*) oder 1 s pecific .... – user4309587

+0

Bitte werfen Sie hier einen Blick darauf: https://neelbhhatt40.wordpress.com/2015/09/10/what-is-cors-and-how-to-enable-it-in-asp- net-5vnext/ – Neel

Antwort

53

hier beschrieben als: Setting Access-Control-Allow-Origin in ASP.Net MVC - simplest possible method

Sie sollten nur einen Aktionsfilter erstellen und die Header dort eingestellt. Sie können diesen Aktionsfilter für Ihre Aktionsmethoden verwenden, wo immer Sie möchten.

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
     base.OnActionExecuting(filterContext); 
    } 
} 

Wenn Sie mehrere Domänen hinzufügen möchten, können Sie die Kopfzeile nicht einfach mehrmals festlegen. In Ihrem Aktionsfilter müssen Sie überprüfen, ob die anfragende Domain aus Ihrer Domänenliste stammt, und dann den Header festlegen.

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var domains = new List<string> {"domain2.com", "domain1.com"}; 

     if (domains.Contains(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Host)) 
     { 
      filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
+1

Tjis ist nützlich, denn dann kann ich es nur für die Methoden beschränken, die ich enthüllen möchte, aber ich möchte zwei verschiedene Domänen zulassen. Nicht alle (*) und nicht nur eine (www.domain.com) Kann ich mehr als einen Header für den Ursprung hinzufügen? Beispiel: filterContext.RequestContext.HttpContext.Response.AddHeader ("Access-Control-Allow-Origin", "domain1.com"); filterContext.RequestContext.HttpContext.Response.AddHeader ("Access-Control-Allow-Origin", "domain2.com"); – user4309587

+0

@ user4309587 Ich habe meine Antwort aktualisiert –

+0

@ user4309587 konnten Sie nicht die Domäne von 'Request' bekommen, dann bedingte den richtigen Header-Wert hinzufügen? – Jasen