wcf REST-Services und JQuery Ajax Post: Methode ist nicht zugelassen
Jemand weiß, was ist daran falsch? I cant get die json-Antwort von meinem wcf rest service.
Jquery
$.ajax({
type: 'POST',
url: "http://localhost:8090/UserService/ValidateUser",
data: {username: 'newuser', password: 'pwd'},
contentType: "application/json; charset=utf-8",
success: function(msg) {
alert(msg);
},
error: function(xhr, ajaxOptions, thrownError) {
alert('error');
}
});
Service
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class UserService: IUserService
{
private readonly IUserRepository _repository;
public UserService()
{
_repository = new UserRepository();
}
public ServiceObject ValidateUser(string username, string password)
{
//implementation
}
}
[ServiceContract]
public interface IUserService
{
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
[OperationContract]
ServiceObject ValidateUser(string username, string password);
}
web-config
<system.serviceModel>
<!--Behaviors here.-->
<behaviors>
<endpointBehaviors>
<behavior name="defaultEndpointBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<!--End of Behaviors-->
<!--Services here-->
<services>
<service name="MyWcf.Services.UserService">
<endpoint address="UserService" behaviorConfiguration="defaultEndpointBehavior"
binding="webHttpBinding" contract="MyWcf.Services.IUserService" />
</service>
</services>
<!--End of Services-->
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name=""
helpEnabled="true"
automaticFormatSelectionEnabled="true"
defaultOutgoingResponseFormat ="Json"
crossDomainScriptAccessEnabled="true"/>
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
InformationsquelleAutor h3n | 2011-07-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich mehrere Probleme in deinem code:
405 means-Methode nicht erlaubt - es kann bedeuten, dass Sie der Veröffentlichung der Daten zu falschen Ressourcen. Sind Sie sicher, dass Ihre Adresse korrekt ist? Wie setzen Sie den service? Ist es
.svc
Datei oderServiceRoute
? Wenn es.svc
- Datei wird die AdresseUserService.svc/UserService/ValidateUser
ServiceRoute
Sie können neu diesesNun Ihre JSON-Anforderung ist ganz schlecht und dein Signatur der Methode als gut. Signatur der Methode in Ihrem service-Vertrag müssen damit rechnen, einzelnes JSON-Objekt = es muss einzelne Daten-Vertrag wie:
und Betrieb Unterschrift:
Es ist kein wrapper-element im JSON-Anforderung und wegen, die Sie verwenden müssen
Bare
. Es ist auch nicht nötig um das Antwort-format, da legen Sie es auf endpoint-Ebene (btw. Sie müssen auch festlegen Anfrage-format, wenn Sie nicht).Sobald Sie die benutzerdefinierte Daten-Vertrag für Ihre Anfrage müssen Sie korrekt definieren ajax-request selbst:
JSON-Objekt als string! und alle seine Mitglieder als auch!
Letzten, ändern Sie die Konfiguration:
Wenn Sie verwenden möchten
standardEndpoint
müssen Siekind
im Endpunkt-definition, und Sie brauchen nicht, um anzugeben, Verhalten (es ist Teil der standard-Endpunkt). Auch Sie sind nicht mit cross-domain Aufrufe, so brauchen Sie nicht, um Ihnen zu ermöglichen und Sie nicht brauchen, Standard-format, weil es automatisch aufgelöst.Ich folgte Ihrer änderung, und wenn ich es versuchte, es sagt: "ValidateUser' der Vertrag 'IUserService' gibt mehrere request-body Parameter werden serialisiert ohne wrapper-Elemente. Höchstens eine Körper-parameter serialisiert werden kann, ohne wrapper-Elemente. Entweder entfernen Sie die zusätzlichen Körper-Parameter oder legen Sie die BodyStyle-Eigenschaft auf die WebGetAttribute/WebInvokeAttribute Gewickelt.
Damit Sie nicht wie meine änderungen, weil meine
ValidateUser
nicht mehrere Parameter request-body.Ich habe mich verändert den parameter UserData, und wenn ich lief, "Methode nicht Erlaubt". In Global.asax, lege ich den ff und es funktioniert: HttpContext.Aktuelle.Antwort.AddHeader("Access-Control-Allow-Origin","*"); HttpContext.Aktuelle.Antwort.AddHeader("Access-Control-Allow-Methods","GET, POST"); HttpContext.Aktuelle.Antwort.AddHeader("Access-Control-Allow-Header","Content-Type", "Akzeptieren"); HttpContext.Aktuelle.Antwort.End();
Ja, es ist ein Weg da, die ich getestet habe exakt die Veränderungen, die ich beschrieben mit .aspx-Seite mit jquery und sowohl die Seite und der service gehostet auf meinem lokalen IIS-und es funktionierte ohne jedes problem und ohne irgendwelche Anforderungen zu ändern-Header.
InformationsquelleAutor Ladislav Mrnka
Ich glaube, Ivan ist auf dem richtigen Weg!
Die Sie anrufen, Ihr service von javascript im browser, richtig?
Funktioniert die html-Seite mit javascript-befinden sich in der gleichen Domäne wie der wcf-Dienst?
Wenn Sie nicht in der gleichen Domäne, dann würde ich sagen, dass es ein cross-site-scripting Problem. Ich glaube HOLEN ist erlaubt cross-sites, aber POSTEN nicht. http://en.wikipedia.org/wiki/JSONP wäre eine Lösung, wenn es unterstützt server-side (WCF)
Es erklärt ganz ok, bei en.wikipedia.org/wiki/Same_origin_policy, aber wenn Sie sind auf der Suche nach Antworten, finden Sie eine Reihe von Kommentaren hier auf, SO z.B. stackoverflow.com/questions/298745/...
InformationsquelleAutor Joakim
Getestet haben Sie auf einem Domäne-ich nehme an, der Autor versuchen, Anruf von einer anderen domain. Es konnte unmöglich sein, aufgrund von cross-domain Aufrufe.
InformationsquelleAutor Ivan