Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Asp.net Web API ½â¾ö¿çÓòÏê½â
 
  8622  次浏览      30
 2018-5-14
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ¼òÊ飬±¾½Ì³ÌչʾÁËÈçºÎÔÚWeb APIµÄÓ¦ÓóÌÐòÖÐÆôÓÃCROS£¬Ï£Íû¶ÔÄúµÄѧϰÓаïÖú¡£

ä¯ÀÀÆ÷°²È«·ÀÖ¹webÒ³Ãæ·¢³öAJAXÇëÇóµ½ÁíÒ»¸öÁìÓò¡£ÕâÖÖÏÞÖÆ³ÆÎªÍ¬Ô´²ßÂÔ,ÕâÊÇΪÁË·ÀÖ¹¶ñÒâÍøÕ¾¶ÁÈ¡Ãô¸ÐÊý¾Ý¡£È»¶ø,ÓÐʱºò¡£Äú¿ÉÄÜÏëÒªÈÃÆäËûÍøÕ¾µ÷ÓÃÄúµÄweb API¡£

Cross Origin Resource Sharing£¨CORS£©ÊÇÒ»ÖÖW3C±ê×¼,ÔÊÐí·þÎñÆ÷·ÅËÉͬԴ²ßÂÔ¡£CROS,·þÎñÆ÷¿ÉÒÔÔÊÐíһЩ¿çÓòÔ´¶ø¾Ü¾øÆäËûÓòµÄÇëÇó¡£CORS±È֮ǰJSONPµÈ¼¼Êõ¸ü°²È«¡¢¸üÁé»î¡£±¾½Ì³ÌչʾÁËÈçºÎÔÚWeb APIµÄÓ¦ÓóÌÐòÖÐÆôÓÃCROS¡£

½éÉÜ

±¾½Ì³ÌÑÝʾÁËASP.NET Web API.ÖÐʹÓà CORS¡£ÎÒÃǽ«Ê×ÏÈ´´½¨Á½¸öASP.NET ÏîÄ¿¡£Ò»¸ö°üº¬Web API¿ØÖÆÆ÷µÄ¡°WebService¡±,ÁíÍâÒ»¸öÆäËû¡°WebClient¡±,Ëüµ÷ÓÃWebServiceµÄ½Ó¿Ú¡£ÒòΪÁ½¸öÓ¦ÓóÌÐòÔÚ²»Í¬µÄÁìÓò,Ò»¸öAJAXÇëÇó´ÓWebClientµ½WebServiceÊÇÒ»¸ö¿çÔ´µÄÒªÇó¡£

ʲôÊÇͬԴ

Èç¹ûÁ½¸öURLËûÃÇÓÐÏàͬµÄÓòÃû,¶Ë¿ÚºÅ£¬ÕâÁ½¸öURL¾ÍÊÇÓÐÏàͬµÄÔ´.¼´£ºÍ¬Ô´

ÏÂÃæÊÇͬԴµÄÁ½¸öURL

1 http://example.com/foo.htm

2 http://example.com/bar.html

ÏÂÃæ¼¸¸öURLÏà±ÈÉÏÃæÁ½¸öURLÊDz»Í¬Ô´µÄ

1 http://example.net

2 http://example.com:9000/foo.html

3 https://example.com/foo.html

4 https://www.example.com/foo.html

´´½¨WebService ÏîÄ¿

Ìí¼ÓÒ»¸ö ÃûΪ TestControllerWeb API ¿ØÖÆÆ÷

using System.Net.Http;
using System.Web.Http;
namespace WebService.Controllers
{
public class TestController : ApiController
{
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent("GET: Test message")
};
}
public HttpResponseMessage Post()
{
return new HttpResponseMessage()
{
Content = new StringContent("POST: Test message")
};
}
public HttpResponseMessage Put()
{
return new HttpResponseMessage()
{
Content = new StringContent("PUT: Test message")
};
}
}
}

Äã¿ÉÒÔÔÚ±¾µØÔËÐÐÓ¦ÓóÌÐò»ò²¿Êðµ½Azure¡£(±¾½Ì³ÌÖеĽØÍ¼,ÎÒWebÓ¦ÓóÌÐò²¿Êðµ½AzureÓ¦Ó÷þÎñ¡£)ÑéÖ¤web APIÊÇ·ñÆô¶¯³É¹¦,µ¼º½µ½http://hostname/api/test/,Ö÷»úÃûÊÇÊðÓ¦ÓóÌÐòʱʹÓõÄÓòÃû¡£ÄúÓ¦¸Ã¿´µ½ÏìÓ¦±¨ÎÄ,¡°GET: Test Message¡±¡£

´´½¨WebClient ÏîÄ¿

ÔÚ½â¾ö·½°¸×ÊÔ´¹ÜÀíÆ÷,´ò¿ªÎļþ/ Home / Index.cshtml ¡£ÓÃÒÔÏ´úÂëÌæ»»¸ÃÎļþÖеĴúÂë:

<div>
<select id="method">
<option value="get">GET</option>
<option value="post">POST</option>
<option value="put">PUT</option>
</select>
<input type="button" value="Try it" onclick="sendRequest()" />
<span id='value1'>(Result)</span>
</div>
@section scripts {
<script>
// TODO: Replace with the URL of your WebService app
var serviceUrl = 'http://mywebservice/api/test';
function sendRequest() {
var method = $('#method').val();
$.ajax({
type: method,
url: serviceUrl
}).done(function (data) {
$('#value1').text(data);
}).error(function (jqXHR, textStatus, errorThrown) {
$('#value1').text(jqXHR.responseText || textStatus);
});
}
</script>
}

±¸×¢£ºserviceUrl±äÁ¿,ʹÓÃWebService ÏîÄ¿µÄURI¡£ÏÖÔÚÔÚ±¾µØÔËÐÐWebClientÓ¦ÓóÌÐò»ò·¢²¼µ½ÁíÒ»¸öÍøÕ¾¡£

µã»÷"Try It¡±°´Å¥Ìá½»Ò»¸öAJAXÇëÇóµ½WebServiceÓ¦ÓóÌÐò,ʹÓÃÏÂÀ­¿òÖÐÁгöµÄHTTP·½·¨(GET¡¢POST¡¢»òÕßput)¡£ÕâÈÃÎÒÃǼì²é²»Í¬¿çÔ´ÇëÇó¡£ÏÖÔÚ, WebServiceÓ¦ÓóÌÐò²»Ö§³ÖCORS,ËùÒÔÈç¹ûÄãµ¥»÷°´Å¥,Äã»áµÃµ½Ò»¸ö´íÎó¡£

ÔÊÐíCORS

ÏÖÔÚÈÃÎÒÃÇÔÚWebServiceÓ¦ÓÃCORS¡£Ê×ÏÈ,Ìí¼ÓCORSNuGet°ü¡£ÔÚVisual StudioÖÐ,´Ó¡°¹¤¾ß¡±²Ëµ¥ÉÏ,Ñ¡Ôñ¿âÈí¼þ°ü¹ÜÀíÆ÷,È»ºóÑ¡Ôñ°ü¹ÜÀíÆ÷¿ØÖÆÌ¨¡£ÔÚ°ü¹ÜÀíÆ÷¿ØÖÆÌ¨´°¿ÚÖÐ,¼üÈëÒÔÏÂÃüÁî:

nstall-Package Microsoft.AspNet.WebApi.Cors

Õâ¸öÃüÁî°²×°×îеİüºÍ¸üÐÂËùÓÐÒÀÀµÏî,°üÀ¨ºËÐÄWeb API¿â¡£User version±êÖ¾Õë¶ÔÒ»¸öÌØ¶¨µÄ°æ±¾¡£ CORS°üÐèÒªWeb API 2.0»ò¸ü¸ß°æ±¾¡£

´ò¿ªÎļþApp_Start / WebApiConfig.cs¡£½«ÏÂÃæµÄ´úÂëÌí¼Óµ½WebApiConfig.Register·½·¨¡£

using System.Web.Http;
namespace WebService
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// New code
config.EnableCors();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}

½ÓÏÂÀ´,TestControllerÀàÌí¼ÓEnableCorsÊôÐÔ:

using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Cors;
namespace WebService.Controllers
{
[EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]
public class TestController : ApiController
{
// Controller methods not shown...
}
}

origins²ÎÊý,ʹÓÃWebClientÓ¦ÓóÌÐò²¿ÊðʱÓÃÓõĵÄURI£¬ÕâÔÊÐí¿çÓòÔ´À´×ÔWebClientµÄÇëÇó,ͬʱ»¹½ûÖ¹ËùÓÐÆäËû¿çÓòÇëÇó¡£Ö®ºó,ÎÒ½«ÏêϸÃèÊö[EnableCors]µÄ²ÎÊý¡£

±¸×¢£ºURIÓëURL²»Í¬£¬URI £ºUniform Resource Identifier£¬Í³Ò»×ÊÔ´±êʶ·û

URL£ºUniform Resource Locator£¬Í³Ò»×ÊÔ´¶¨Î»·û

URIÒÔschemeºÍðºÅ¿ªÍ·¡£SchemeÓôóд/Сд×Öĸ¿ªÍ·£¬ºóÃæÎª¿Õ»òÕ߸úןü¶àµÄ´óд/Сд×Öĸ¡¢Êý×Ö¡¢¼ÓºÅ¡¢¼õºÅºÍµãºÅ¡£Ã°ºÅ°ÑschemeÓëscheme-specific-part·Ö¿ªÁË£¬²¢ÇÒscheme-specific-partµÄÓï·¨ºÍÓïÒ壨Òâ˼£©ÓÉURIµÄÃû×Ö¿Õ¼ä¾ö¶¨¡£ÈçÏÂÃæµÄÀý×Ó£º

http://ÓòÃû£¬ÆäÖÐhttpÊÇscheme£¬//ÓòÃû ÊÇscheme-specific-part£¬²¢ÇÒËüµÄschemeÓëscheme-specific-part±»Ã°ºÅ·Ö¿ªÁË¡£

ÖØÐ²¿Êð¸üÐÂWebService µÄÓ¦ÓóÌÐò¡£Äã²»ÐèÒª¸üÐÂWebClient¡£ÏÖÔÚWebClientµÄAJAXÇëÇóÓ¦¸Ã³É¹¦¡£GET¡¢PUTºÍPOST·½·¨¶¼ÊÇÔÊÐíµÄ¡£

CORS¹¤×÷Ô­Àí

±¾½ÚÃèÊöÁËÔÚHttpЭÒé±ê×¼ÉÏhttp¿çÓòÇëÇóÖо¿¾¹·¢ÉúÁËʲô¡£ÖØÒªµÄÊÇÒªÀí½âCORSÊÇÈçºÎ¹¤×÷µÄ,ÕâÑùÄã¾Í¿ÉÒÔÕýÈ·ÅäÖÃ[EnableCors]ÊôÐÔ,ºÍÈç¹ûCORS²»ÏñÄúÔ¤ÆÚµÄÄÇÑù¹¤×÷ÔõÑùÅųý´íÎó¡£

CORSΪÁËÔÊÐíʹ¿çÔ´ÇëÇóÒýÈëÁ˼¸¸öеÄHTTPÍ·¡£Èç¹ûä¯ÀÀÆ÷Ö§³ÖCORS,Ëü×Ô¶¯ÉèÖÃÕâЩÇëÇóÍ·£¬Äã²»ÐèÒªÔÚÄãµÄJavaScript´úÂë×öÈκÎÐ޸ġ£

ÕâÊÇÒ»¸ö¿çÓòÇëÇóµÄÀý×Ó¡£OriginÇëÇóÍ·ÌṩÁ˲úÉúÕâ¸ö¿çÓòÇëÇóµÄÍøÕ¾ÓòÃû¡£

ÇëÇó±¨ÎÄ

Èç¹û·þÎñÆ÷ÔÊÐíÕâ¸ö¿çÓòÇëÇó£¬ÏìÓ¦±¨ÎÄÖÐ×Ô¶¯ÉèÖÃAccess-Control-Allow-OriginÍ·¡£Õâ¸öÍ·µÄֵƥÅäÇëÇó±¨ÎÄÖÐOriginÍ·µÄÖµ,»òÕßÊÇͨÅä·û¡°*¡±,ÕâÒâζ×ÅÈÎºÎÆðÔ´ÊDZ»ÔÊÐíµÄ¡£

ÏìÓ¦±¨ÎÄ

Èç¹ûÏìÓ¦²»°üÀ¨Access-Control-Allow-OriginÍ·,ÕâÊÇAJAXÇëÇóʧ°Ü¡£¾ßÌåÀ´ËµÊÇä¯ÀÀÆ÷²»ÔÊÐíÇëÇó¡£¼´Ê¹·þÎñÆ÷·µ»ØÒ»¸ö³É¹¦µÄÏìÓ¦,ä¯ÀÀÆ÷ÏìÓ¦µÄ½á¹û²»¿ÉÓÃÓÚ¿Í»§¶ËÓ¦ÓóÌÐò¡£

CORS Ô¤¼ìÇëÇópreflight request

¶ÔÓÚһЩCORSÇëÇó,ä¯ÀÀÆ÷»á·¢ËÍÒ»¸ö¶îÍâµÄÇëÇó,³ÆÎªÔ¤¼ìÇëÇó¡°preflight request¡±,ÔÚ·¢Ë͵Äʵ¼ÊÇëÇóµÄ×ÊԴ֮ǰ¡£

ä¯ÀÀÆ÷¿ÉÒÔÌø¹ýpreflight requestÈç¹ûÏÂÁÐÌõ¼þÊôʵ:

1 ÇëÇóµÄ·½·¨ÊÇGET, HEAD, or POST,µÈ

2 Ó¦ÓóÌÐò²»ÉèÖÃÈκÎÇëÇóÍ·³ýÁËAccept, Accept-Language, Content-Language, Content-Type, or Last-Event-IDµÈ

3 content - type±¨Í·(Èç¹ûÉèÖÃ)ÊÇÏÂÁÐÖ®Ò»:

application/x-www-form-urlencoded
multipart/form-data
text/plain

Õâ¸öÇëÇóÍ·µÄ¹æ·¶ÊÊÓÃÓÚµ±Ó¦ÓóÌÐòµ÷ÓÃsetRequestHeade XMLHttpRequest¶ÔÏóʱ·¢ÆðµÄÇëÇóÍ·¡£ ¹æ·¶²¢²»ÊÊÓÃÓÚä¯ÀÀÆ÷µÄÇëÇóÍ·¿ÉÒÔÉèÖÃ,ÈçÓû§´úÀí,Ö÷»ú,»òÄÚÈݳ¤¶È¡£

ÏÂÃæÊÇpreflight requestµÄÒ»¸öÀý×Ó

pre-flightÇëÇóʹÓÃHTTP OPTIONS·½·¨¡£Ëü°üÀ¨Á½¸öÌØÊâµÄÇëÇóÍ·:

Access-Control-Request-Method:HTTP·½·¨½«±»ÓÃÓÚʵ¼ÊµÄÇëÇó¡£

Access-Control-Request-Headers:Ó¦ÓóÌÐòÉèÖõÄʵ¼ÊµÄÇëÇóÍ·µÄÁÐ±í¡£(ͬÑù,Õâ²¢²»°üÀ¨ä¯ÀÀÆ÷ÉèÖõÄÇëÇóÍ·¡£)

ÕâÀïÓÐÒ»¸öÏìÓ¦±¨ÎÄÀý×Ó,¼ÙÉè·þÎñÆ÷ÔÊÐíÇëÇó:

ÏìÓ¦°üº¬Ò»¸öAccess-Control-Allow-MethodsÁгöÔÊÐíµÄ·½·¨¡¢ºÍ¿Éѡһ¸öAccess-Control-Allow-HeadersÍ·ÁбíÔÊÐíµÄÍ·¡£Èç¹ûpreflightÇëÇó³É¹¦,ä¯ÀÀÆ÷·¢ËÍʵ¼ÊµÄÇëÇó,ÈçǰËùÊö¡£

[EnableCors]ÉèÖÃ

Äú¿ÉÒÔÆôÓà CORSÔÚÿһ¸ö action,controller,»òWeb APIÈ«¾Ö¿ØÖÆÆ÷ÖС£

1 actionÉèÖÃ

ÔÚactionÉÏÔÊÐí¿çÓò£¬ÉèÖÃ[EnableCors]ÊôÐÔµÄaction·½·¨¡£ÏÂÃæµÄÀý×ÓʹGetItemmethod µ¥¶ÀÔÊÐí¿çÓò

public class ItemsController : ApiController
{
public HttpResponseMessage GetAll() { ... }
[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]
public HttpResponseMessage GetItem(int id) { ... }
public HttpResponseMessage Post() { ... }
public HttpResponseMessage PutItem(int id) { ... }
}

2 controllerÉèÖÃ

Èç¹ûÄúÉèÖÃEnableCorsÔÚ¿ØÖÆÆ÷,ËüÊÊÓÃÓڸÿØÖÆÆ÷ÉϵÄËùÓеÄaction¡£Èç¹ûÏë¶Ôijһ¸öaction½ûÓÿçÓò£¬ÇëʹÓÃ[DisableCors]ÌØÐÔ¡£ÏÂÃæµÄÀý×Ó³ýÁËPutItem action ÆäËûaction¶¼Ö§³Ö¿çÓò¡£

[EnableCors(origins: "http://www.example.com", headers: "*", methods: "*")]
public class ItemsController : ApiController
{
public HttpResponseMessage GetAll() { ... }
public HttpResponseMessage GetItem(int id) { ... }
public HttpResponseMessage Post() { ... }
[DisableCors]
public HttpResponseMessage PutItem(int id) { ... }
}

3 È«¾ÖÉèÖÃ

ÔÚÓ¦ÓóÌÐòÖÐΪËùÓÐWeb API ¿ØÖÆÆ÷ÔÊÐí¿çÓò,½«Ò»¸öEnableCorsAttributeʵÀý´«µÝ¸øEnableCors·½·¨:

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

Èç¹ûÄãÔÚ¶à¸ö·¶Î§ÄÚ¶à¸öÉèÖÃ[EnableCors]¡¢ÓÅÏÈ˳ÐòÊÇ:

1Action
2Controller
3Global

[EnableCors]²ÎÊýorigin½éÉÜ

[EnableCors]µÄorigins ²ÎÊýÖ¸¶¨ÁËÄÄÒ»¸öÇëÇóÆðÔ´ÊÇÔÊÐí·ÃÎʵġ£ÔÊÐíµÄÖµÖ®¼äÊÇÒ»¸öÒÔ¶ººÅ·Ö¸ôµÄ¡£

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

[EnableCors]²ÎÊýmethods½éÉÜ

[EnableCors]ÌØÐÔµÄmethods£¬Ö¸¶¨ÁËÄÄÒ»¸öHTTP·½·¨¿ÉÒÔ·ÃÎÊ×ÊÔ´¡£ÎªÁËʹËùÓз½·¨¶¼¿ÉÒÔ·ÃÎÊ£¬Ê¹ÓÃͨÅä·û¡° * ¡±¡£ÏÂÃæÊÇÒ»¸öÖ»ÔÊÐíGETºÍPOST·½·¨µÄÇëÇóʾÀý£º

[EnableCors(origins: "http://www.example.com", headers: "*", methods: "get,post")]
public class TestController : ApiController
{
public HttpResponseMessage Get() { ... }
public HttpResponseMessage Post() { ... }
public HttpResponseMessage Put() { ... }
}

[EnableCors]²ÎÊýheaders½éÉÜ

[EnableCors]ÌØÐÔµÄheaders£¬Ö¸¶¨ÁËÄÄÒ»¸öHTTPÇëÇóÍ·¿ÉÒÔ·ÃÎÊ×ÊÔ´¡£ÎªÁËʹÈκÎÇëÇóÍ·¶¼¿ÉÒÔ·ÃÎÊ£¬Ê¹ÓÃͨÅä·û¡° * ¡±£¬¶à¸öÔÊÐíµÄheadersÖ®¼äʹÓÃÒ»¸ö¶ººÅÀ´·Ö¸ô¡£

[EnableCors(origins: "http://example.com",
headers: "accept,content-type,origin,x-my-header", methods: "*")]

ÉèÖÃÔÊÐíÏìÓ¦±êÍ·

ĬÈÏÇé¿öÏÂ,ä¯ÀÀÆ÷²»¹«¿ªËùÓеÄÓ¦ÓóÌÐòÏìÓ¦±êÍ·¡£¿ÉÓõÄÏìӦͷĬÈÏÇé¿öÏÂÊÇ:

Cache-Control
Content-Language
Content-Type
Expires
Last-Modified
Pragma

CORS ¹æ¶¨Á˵÷ÓÃÕâЩ¼òµ¥µÄÏìӦͷ¡£ÓÚÓ¦ÓóÌÐòÖÐʹÓÃÆäËûÍ·Îļþ,ÇëÉèÖÃ[EnableCors]µÄexposedHeaders²ÎÊý

ÔÚ½ÓÏÂÀ´µÄÀý×ÓÖÐ,¿ØÖÆÆ÷µÄGet·½·¨ÉèÖÃÒ»¸ö×Ô¶¨Òå±êÍ·ÃüÃûΪ¡°X-Custom-Header¡±¡£Ä¬ÈÏÇé¿öÏÂ,ä¯ÀÀÆ÷²»»áÔÚ¿çÔ´µÄÇëÇóÖб©Â¶Õâ¸ö×Ô¶¨Òå±êÍ·¡£ÎªÁËʹ×Ô¶¨Òå±êÍ·ÓÐЧ,ʹ exposedHeaders ²ÎÊýµÄֵΪX-Custom-Header¡±¡£

[EnableCors(origins: "*", headers: "*", methods: "*", exposedHeaders: "X-Custom-Header")]
public class TestController : ApiController
{
public HttpResponseMessage Get()
{
var resp = new HttpResponseMessage()
{
Content = new StringContent("GET: Test message")
};
resp.Headers.Add("X-Custom-Header", "hello");
return resp;
}
}

ÔÚ¿çÓòÇëÇóÖÐͨ¹ýÖ¤ÊéÇëÇó

¿çÓòÇëÇóÖÐʹÓÃÖ¤ÊéÐèÒªÌØÊâ´¦Àí¡£Ä¬ÈÏÇé¿öÏÂ,ä¯ÀÀÆ÷²»·¢ËÍÈκÎÖ¤Ê鯾֤Óë¿çÔ´µÄÒªÇ󡣯¾Ö¤²»µ«°üÀ¨cookies»¹°üÀ¨HTTPÉí·ÝÑéÖ¤·½°¸¡£ÎªÁËÔÚ¿çÔ´ÇëÇó·¢ËÍÆ¾Ö¤,¿Í»§¶Ë±ØÐëÉèÖÃXMLHttpRequest.withCredentialsΪtrue¡£

var xhr = new XMLHttpRequest();
xhr.open('get', 'http://www.example.com/api/test');
xhr.withCredentials = true;

´ËÍâ,·þÎñÆ÷±ØÐëÔÊÐíÆ¾¾Ý¡£ÔÚWeb API,(EnableCors)ÌØÐÔµÄÔÊÐí¿çԴƾ֤SupportsCredentials²ÎÊýÉèÖÃΪtrue

$.ajax({
type: 'get',
url: 'http://www.example.com/api/test',
xhrFields: {
withCredentials: true
}

Èç¹ûÕâ¸öÊôÐÔÊÇtrue,HTTPÏìÓ¦½«°üº¬Access-Control-Allow-CredentialsÍ·¡£Õâ¸öÍ·¸æËßä¯ÀÀÆ÷¿çÔ´ÇëÇóµÄ·þÎñÆ÷ÔÊÐíÆ¾¾Ý¡£

Èç¹ûä¯ÀÀÆ÷·¢ËÍÖ¤Êé,µ«ÊÇÏìÓ¦²»°üÀ¨Ò»¸öÓÐЧµÄAccess-Control-Allow-CredentialsÍ·,ä¯ÀÀÆ÷²»»á¹«¿ªÏìÓ¦Ó¦ÓóÌÐò,²¢ÇÒAJAXÇëÇóʧ°Ü¡£

Îñ±ØÐ¡ÐĽ«SupportsCredentialsÉèÖÃΪtrue,ÒòΪÕâÒâζÔÚÒ»¸öÍøÕ¾ÔÚÁíÒ»¸öÓò¿ÉÒÔ·¢ËÍÒ»¸öµÇ¼µÄÓû§µÄƾ֤´ú±íÓû§µÄWeb API,¡£CORS»¹¹æ¶¨,ÉèÖá°*¡±µÄOriginÊÇÎÞЧµÄ£¬ÔÚSupportsCredentialsÊÇtrueµÄÇé¿öÏ¡£

×Ô¶¨Òå[EnableCors]ÌØÐÔ

[EnableCors]ÌØÐÔʵÏÖÁËICorsPolicy

[EnableCors(origins: "http://myclient.azurewebsites.net", headers: "*",
methods: "*", SupportsCredentials = true)]

Provider½Ó¿Ú¡£Äú¿ÉÒÔÌṩ×Ô¼ºµÄʵÏÖͨ¹ý´´½¨Ò»¸öÀà,ËüÀ´¼Ì³ÐAttributeºÍʵÏÖÁËICorsProlicyProvider½Ó¿Ú¡£

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class MyCorsPolicyAttribute : Attribute, ICorsPolicyProvider
{
private CorsPolicy _policy;
public MyCorsPolicyAttribute()
{
// Create a CORS policy.
_policy = new CorsPolicy
{
AllowAnyMethod = true,
AllowAnyHeader = true
};
// Add allowed origins.
_policy.Origins.Add("http://myclient.azurewebsites.net");
_policy.Origins.Add("http://www.contoso.com");
}
public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request)
{
return Task.FromResult(_policy);
}
}

ÏÖÔÚÄã¿ÉÒÔÔÚÄãÏëÒªÔÊÐí¿çÓòµÄÈκεط½Ê¹ÓÃÄã¸Õ²Å×Ô¶¨ÒåµÄ[EnableCors].ÌØÐÔ

[MyCorsPolicy]
public class TestController : ApiController
{
.. //
}

   
8622 ´Îä¯ÀÀ       30
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì