J'ai une bibliothèque service WCF exposée à travers mon site ASPX comme suitProblème appel bibliothèque service WCF de jQuery
[System.ServiceModel.OperationContract]
[System.ServiceModel.Web.WebInvoke(
Method= "POST",
RequestFormat=System.ServiceModel.Web. WebMessageFormat .Json,
ResponseFormat=System.ServiceModel.Web.WebMessageFormat .Json)]
LogonResponse Logon(LogonRequest logonRequest);
[System.Runtime.Serialization.DataContract]
[ Serializable()]
public class LogonRequest
{
[System.Runtime.Serialization.DataMember]
public string EMailAddress;
[System.Runtime.Serialization.DataMember]
public string Password;
}
Dans Ma page de test, je peux appeler soit par MS Ajax: -
<asp:ScriptManager ID ="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/testService.svc" />
</Services>
</asp:ScriptManager>
.
.
.
function clsLogonRequest(eMailAddress, password) {
this .EMailAddress = eMailAddress;
this .Password = password;
}
function login(eMailAddress, password) {
var LogonRequest = new clsLogonRequest(eMailAddress, password);
name.API.IAPI.Logon(LogonRequest, onSuccess, onFailure);
}
function onSuccess(result) {
$("#txtSessionId").val(result.SessionId);
$("#txtUserName").val(result.Name);
$("#txtUserId").val(result.UserId);
}
qui fonctionne très bien, ou par un appel jQuery $ .ajax: -
$(document).ready(function() {
$("#Button1").click(function() {
var LogonRequest = new clsLogonRequest('*************' , '***********');
$.ajax({
type: "POST",
url: "testService.svc/Logon",
data: "{'logonRequest':" + JSON.stringify(LogonRequest) + "}" ,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert(msg.d);
}
});
});
});
qui n'a pas - sous Firebug je peux voir e e 500 Message d'erreur interne du serveur et l'exception commence
{"ExceptionDetail":{"HelpLink":null,"InnerException":null,"Message":"The token '\"' was expected but found '''.","StackTrace":" at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)\u000d\u000a at System.Xml.XmlExceptionHelper .ThrowTokenExpected(XmlDictionaryReader reader, String expected, Char found)\u000d\u000a at System.Runtime...
Pourquoi apparaît-il que l'appel jQuery passe XML quand je suis spécifiquement dit-il pas (et comment puis-je l'arrêter afin que les appels de toutes les sources sont traitées aussi naturellement que possible)?
Merci d'avance.
EDIT:
Merci pour les suggestions, j'ai regardé ce que vous avez dit et je pense que mon explication du problème n'a pas été assez clair.
Le problème n'est pas que JSON n'est pas envoyé, il est envoyé et est dans le bon format, je peux le voir depuis firebug. Le problème est que la bibliothèque de service WCF semble attendre le code XML et tombe quand elle reçoit JSON. Pour être sûr que je n'ai pas oublié la solution suggérée, voici l'extrait web.Config - J'ai essayé de supprimer le comportement et de supprimer l'attribut behaviorConfiguration de la balise services/service/endpoint et cela fait juste le tout échoue sans sortir de la page.
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name ="MyServiceTypeBehaviors ">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name ="AspNetAjaxBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled= "true " />
<services>
<service name ="test.API.API" behaviorConfiguration = " MyServiceTypeBehaviors">
<endpoint behaviorConfiguration="AspNetAjaxBehavior" binding = " webHttpBinding" contract="test.API.IAPI" />
<endpoint contract ="IMetadataExchange" binding= " mexHttpBinding" address="mex" />
</service>
</services>
</system.serviceModel>
Merci à l'avance
merci pour la suggestion, j'ai édité mon message original pour clarifier. – bean
L'exception ressemblera toujours à l'analyse XML car c'est le modèle utilisé par WCF même lorsque les données ne sont pas vraiment XML. Dans le cas de JSON, le DataContractJsonSerialzer est utilisé, mais même celui-ci hérite de XmlObjectSerializer et la pile peut donc donner l'impression qu'elle fonctionne avec XML. Si vous pouviez poster la trace complète de la pile, cela serait également utile. Tout le reste de votre config semble bien, mais avec enableWebScript là-bas, vous devez passer cet objet wrapper comme je l'ai dit. Si vous supprimez l'enableWebScript, vous devrez définir vous-même l'encodage des messages dans JSON. –
J'ai littéralement lolé à la quantité de travail impliqué pour obtenir des services "WCF Ajax Enabled" pour devenir effing "Ajax Enabled". –