Mam WCF usługi Biblioteka wystawiony przez mojej stronie ASPX następującoProblem Wywołanie usługi WCF Biblioteka z 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;
}
Na stronie testowej można wywołać za pośrednictwem 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);
}
który działa dobrze, lub za pośrednictwem jQuery $ .ajax rozmowy: -
$(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);
}
});
});
});
Co nie - pod FireBug widzę th e Komunikat o błędzie 500 Internal Server i wyjątek zaczyna
{"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...
Dlaczego wydaje się, że wezwanie jQuery przechodzi XML kiedy jestem specjalnie informując go nie (i jak mogę zatrzymać go tak, że wywołuje ze wszystkich źródeł są obsługiwane tak naturalnie, jak to możliwe)?
Z góry dziękuję.
EDIT:
Dzięki za sugestie, szukałem na to, co powiedział i myślę, że moje wyjaśnienie problemu nie było wystarczająco jasne.
Problem nie polega na tym, że JSON nie jest wysyłany, jest wysyłany i ma poprawny format, widzę to z firebug. Problem polega na tym, że biblioteka usług WCF wydaje się oczekiwać XML i przewraca się po otrzymaniu JSON.
Dla pewności nie przeoczyłem sugerowanego rozwiązania, oto wyciąg Web.Config - próbowałem usunąć z zachowania i usunąć atrybut behaviorConfiguration z tagu services/service/endpoint, a to sprawia, że wszystko kończy się niepowodzeniem, nie wydostając się ze strony.
<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>
Dzięki z góry
dzięki za sugestię, zredagowałem mój pierwotny wpis, aby wyjaśnić. – bean
Wyjątek będzie zawsze wyglądał tak, jakby analizował XML, ponieważ jest to model używany przez WCF, nawet jeśli dane nie są prawdziwie XML. W przypadku JSON używany jest DataContractJsonSerialzer, ale nawet ten dziedziczy po XmlObjectSerializer, więc stos może sprawić, że będzie wyglądał, jakby działał z XML. Jeśli mógłbyś opublikować pełny ślad stosu, który również byłby przydatny. Cała reszta konfiguracji wygląda dobrze, ale z włączonym opcją enableWebScript MUSISZ przekazać ten obiekt opakowania, tak jak powiedziałem. Jeśli usuniesz enableWebScript, będziesz musiał sam ustawić kodowanie wiadomości na JSON. –
Dosłownie sprzeciwiłem się ilości pracy związanej z uzyskaniem usług "włączonego WCF Ajax", aby uzyskać efekt "Ajax włączony". –