Envoi de données à ServiceStack RESTful service, obtenant 'Accès refusé'

J'ai construit un service RESTful avec ServiceStack qui envoie des données à une base de données. Je l'ai testé localement et ça marche très bien. Lorsque je le déploie sur un serveur et que j'utilise le même code, qui est un appel jjupport $ .ajax, je reçois une erreur «Accès refusé». J'ai configuré CORS dans ma configuration ServiceStack en utilisant le plugin comme expliqué ici . J'ai également défini le crossDomain sur true dans mon appel ajax. Je ne peux pas penser à quoi faire pour que cela fonctionne, et je ne suis sincèrement pas sûr d'où cette erreur est lancée. J'ai parcouru le Javascript et il n'arrive même pas au bloc "échec" de l'appel ajax, l'erreur est lancée avant ça … J'utilise IE9 pour tester, si cela est pertinent …?

Une idée de ce qui pourrait se passer?

Voici ma méthode POST ServiceStack:

public CitationResponse Post(Citation citation) { var response = new CitationResponse { Accepted = false }; if (string.IsNullOrEmpty(citation.ReportNumber)) { response.Accepted = false; response.Message = "No data sent to service. Please enter data in first."; return response; } try { response.ActivityId = Repository.CreateCitation(citation.ReportNumber, citation.ReportNumber_Prefix, citation.ViolationDateTime, citation.AgencyId, citation.Status); response.Accepted = true; } catch (Exception ex) { response.Accepted = false; response.Message = ex.Message; response.RmsException = ex; } return response; } 

Voici ma fonction Javascript qui appelle le service Web:

  SendCitationToDb: function(citation, callback) { $.ajax({ type: "POST", url: Citations.ServiceUrl + "/citations", data: JSON.stringify(citation), crossDomain: true, contentType: "application/json", dataType: "json", success: function (data) { if (!data.Accepted) { Citations.ShowMessage('Citation not added', 'Citation not added to database. Error was: ' + data.Message, 'error'); } else { citation.ActivityId = data.ActivityId; callback(data); } }, failure: function(errMsg) { Citations.ShowMessage('Citation not added', 'Citation not added to database. Error was: ' + errMsg.Message, 'error'); } }); } 

Merci de votre aide!

Mise à jour: Je viens d'exécuter la même application dans Chrome 29 et j'obtiens ces erreurs (remplacé les URL réelles pour la sécurité):

  OPTIONS http://servicedomain.com/citations Origine http://callingdomain.com n'est pas autorisé par Access-Control-Allow-Origin.

 XMLHttpRequest ne peut pas charger http://servicedomain.com//citations.  L'origine http://callingdomain.com n'est pas autorisée par Access-Control-Allow-Origin. 

Mais je permets clairement tous les domaines dans mes en-têtes:

  Plugins.Add(new CorsFeature()); //Enable CORS SetConfig(new EndpointHostConfig { DebugMode = true, AllowJsonpRequests = true, WriteErrorsToResponse = true, GlobalResponseHeaders = { { "Access-Control-Allow-Origin", "*" }, { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" } } }); 

MAINTENANT, si je lance le même appel de service via l' application REST Console de Chrome, je reçois une réponse valide de ServiceStack. Voici l'en-tête de réponse:

  Code d'état: 200
 Date: ven., 20 sept. 2013 19:54:26 GMT
 Serveur: Microsoft-IIS / 6.0
 X-AspNet-Version: 4.0.30319
 X-Powered-By: ASP.NET, ServiceStack / 3.948 Win32NT / .NET
 Access-Control-Allow-Methods: POST, GET, OPTIONS, GET, POST, PUT, DELETE, OPTIONS
 Content-Type: application / json;  Charset = utf-8
 Access-Control-Allow-Origin: *, *
 Cache-Control: privé
 Contenu Longueur: 58 

Je suis donc totalement perdu pour savoir pourquoi il fonctionne dans une requête REST pure, mais pas de l'application ??

Mettre à jour:

Après avoir passé de nombreuses heures à essayer de nombreuses solutions différentes que j'ai trouvées en ligne, ma méthode Configure ressemble maintenant à ceci:

  public override void Configure(Container container) { SetConfig(new EndpointHostConfig { DefaultContentType = ContentType.Json, ReturnsInnerException = true, DebugMode = true, //Show StackTraces for easier debugging (default auto inferred by Debug/Release builds) AllowJsonpRequests = true, ServiceName = "SSD Citations Web Service", WsdlServiceNamespace = "http://www.servicestack.net/types", WriteErrorsToResponse = true, GlobalResponseHeaders = { { "Access-Control-Allow-Origin", "*" }, { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" } } }); container.RegisterAutoWired<Citation>(); container.RegisterAutoWired<Driver>(); container.RegisterAutoWired<Vehicle>(); container.RegisterAutoWired<Violations>(); using (var getAttributes = container.Resolve<AttributesService>()) getAttributes.Get(new AttributesQuery()); Plugins.Add(new CorsFeature()); RequestFilters.Add((httpReq, httpRes, requestDto) => { httpRes.AddHeader("Access-Control-Allow-Origin", "*"); httpRes.AddHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, OPTIONS"); httpRes.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type"); if (httpReq.HttpMethod == "OPTIONS") httpRes.EndServiceStackRequest(); // extension method }); Routes .Add<Attribute>("/attributes", "GET, OPTIONS") .Add<Citation>("/citations", "POST, GET, OPTIONS, DELETE") .Add<Driver>("/driver", "POST, OPTIONS") .Add<Vehicle>("/vehicle", "POST, OPTIONS") .Add<Violations>("/violations", "POST, OPTIONS"); var config = new AppConfig(new ConfigurationResourceManager()); container.Register(config); } } 

À ce stade, je ne suis pas sûr de ce qu'il faut faire. J'ai tout essayé, mais j'ai toujours les mêmes erreurs. Les méthodes continuent de fonctionner correctement en utilisant la console REST dans Chrome, ce qui est un peu exaspérant, car je ne peux jamais les faire appeler les appeler à partir d'une page Web. Je suis presque prêt à réécrire le tout dans WCF, mais j'aimerais vraiment que la version de ServiceStack fonctionne, car je sais que cela fonctionne localement. Si quelqu'un a d'autres suggestions que je peux essayer, j'apprécierais votre aide!

Mise à jour: voir le commentaire en bas pour plus de détails. J'ai dû supprimer les en-têtes de l'onglet En-têtes HTTP dans IIS. Je ne sais pas quand je les ai mis, mais pour quelqu'un d'autre qui pourrait faire face au même problème, voici une capture d'écran de l'onglet dans IIS:

En-têtes Http personnalisés

J'ai eu le même problème avec vous, dans ma question précédente

Vous pouvez lire les réponses utiles de #mythz ici et ici .

Le code que j'utilise dans AppHost

  using System.Web; using ServiceStack.WebHost.Endpoints.Extensions; // for httpExtensions methods // => after v.3.9.60, =>using ServiceStack; 

et

  public override void Configure(Container container) { SetConfig(new ServiceStack.WebHost.Endpoints.EndpointHostConfig { DefaultContentType = ContentType.Json, ReturnsInnerException = true, WsdlServiceNamespace = "http://www.servicestack.net/types" }); Plugins.Add(new CorsFeature()); this.RequestFilters.Add((httpReq, httpRes, requestDto) => { //Handles Request and closes Responses after emitting global HTTP Headers if (httpReq.HttpMethod == "OPTIONS") httpRes.EndServiceStackRequest(); //httpExtensions method // =>after v.3.9.60, => httpRes.EndRequestWithNoContent(); }); Routes .Add<TestRequest>("/TestAPI/Reservation", "POST, OPTIONS"); // OPTIONS is mandatory for CORS } 

Et en JavaScript comme toi

  jQuery.support.cors = true; function TestRequestCall() { var TestRequest = new Object(); TestRequest.Id = 11111; TestRequest.City = "New York"; $.ajax({ type: 'Post', contentType: 'application/json', url: serverIP +'/TestAPI/Reservation', data: JSON.stringify( TestRequest ), dataType: "json", success: function (TestResponse, status, xhr) { if(TestResponse.Accepted) doSomething(); }, error: function (xhr, err) { alert(err); } }); }