2016-03-29 9 views
0

だからthisは、サーバー上の各リソースに対して別々のCORSプリフライトリクエストが必要であることと、カスタムヘッダー(コンテンツタイプJSON)を必要とするRESTFul APIを使用しているためです。しかし、私は(ほぼ)すべてのリクエストに対して2回の往復を避けたいと思っています。複数のCORSリソースを手動でプリフライトすることは可能ですか?

私の理想的な解決策は、1回のリクエストで複数のリソースをプリフライトすることです。したがって、ウェブアプリケーションを/user,/media/preferencesにPOSTできるようにするには、リクエストが最初に送信される前であっても、1回のリクエストでこれを実行できます。それ以外の場合は恐ろしい待ち時間が追加されます。これはCORSでも可能ですか?

答えて

0
public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 
      // Configure Web API to use only bearer token authentication. 
      //config.SuppressDefaultHostAuthentication(); 
      //config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

      // Web API routes 
      config.MapHttpAttributeRoutes(); 
      //var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter; 
      // xml.UseXmlSerializer = true; 

      //var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
      config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
      //json.SerializerSettings.PreserveReferencesHandling = 
      // Newtonsoft.Json.PreserveReferencesHandling.All; 
      //json.SerializerSettings.DateFormatHandling 
      //= Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat; 
      config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

      config.EnableCors(); 
      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 
     } 
    } 

//And on WEBAPI your controller try this. 

[EnableCorsAttribute("http://localhost:8080/", "*", "*")] 
    public class SampleController : ApiController 
    { 
     // GET: api/Club 

     public IEnumerable<Sample> Get() 
     { 
      var SampleRepository = new SampleRepository(); 
      return SampleRepository.Retrieve(); 
     } 

     // GET: api/Sample/id 
     public string Get(int id) 
     { 
      return "value"; 
     } 

     // POST: api/sample 
     public void Post([FromBody]string value) 
     { 
     } 

     // PUT: api/sample/id 
     public void Put(int id, [FromBody]string value) 
     { 
     } 

     // DELETE: api/sample/id 
     public void Delete(int id) 
     { 
     } 
    } 

//In AngularJS you will get what you want this way using CORS through WEB API 

(function() { 
    "use strict"; 
    angular 
     .module('sampleManagement') 
     .controller('SampleListController', 
        ['sampleResource', 
         SampleListController]); 

    function SampleListController(sampleResource) { 
     var vm = this; 

     sampleResource.query(function (data) { 
      vm.Sample = data; 

     }); 
    } 

}()); 



(function() { 
    "use strict"; 

    var app = angular.module('sampleManagement', 
     ['common.services']); 

}()); 


(function() { 
    "use strict"; 
    angular.module('common.services', 
     ['ngResource']) 
    .constant('appSettings', 
    { 
     serverPath: "http://localhost:8080/" 
    }); 
}()); 



(function() { 
    "use strict"; 
    angular 
     .module('common.services') 

     .factory('sampleResource', 
     ['$resource', 
      "appSettings", 
     sampleResource]) 

    function sampleResource($resource, appSettings) { 

     return $resource(appSettings.serverPath + "api/Club/:id"); 

    } 
    app.config(['$resourceProvider', function($resourceProvider) { 

     $resourceProvider.defaults.stripTrailingSlashes = false; 
    }]); 
}()); 
関連する問題