ich eine WCF-Dienstbibliothek haben durch meine ASPX-Website ausgesetzt alsProblem Aufruf WCF Service Library von 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;
}
In Meine Testseite folgt kann ich entweder durch MS Ajax nennen: -
<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);
}
das funktioniert gut, oder durch einen jQuery $ Schnipsel Aufruf: -
$(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);
}
});
});
});
Welche nicht - unter Firebug kann ich sehen, th e 500 Internal Server Error message und die Ausnahme beginnt
{"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...
Warum scheint es, dass die jQuery Aufruf XML ist vorbei, wenn ich es ausdrücklich sage nicht (und wie kann ich es so zu stoppen, die aus allen Quellen ruft werden so natürlich wie möglich gehandhabt)?
Vielen Dank im Voraus.
EDIT:
Danke für die Vorschläge, habe ich sah, was du gesagt und denke, dass meine Erklärung des Problems nicht klar genug war.
Das Problem ist nicht, dass JSON nicht gesendet wird, es gesendet wird und im richtigen Format ist, kann ich das von Firebug sehen. Das Problem besteht darin, dass die WCF-Servicebibliothek XML erwartet und beim Empfang von JSON umfällt.
Nur um sicher zu sein, habe ich nicht die vorgeschlagene Lösung übersehen, hier ist der web.Config-Extrakt - Ich habe versucht, aus dem Verhalten zu entfernen und entfernen Sie die BehaviorConfiguration Attribut aus dem Services/Service/Endpunkt-Tag und das macht nur das Ganze scheitert, ohne die Seite zu verlassen.
<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>
Dank im Voraus
danke für den Vorschlag, habe ich meinen ursprünglichen Posten geklärt, um zu klären. – bean
Die Ausnahme sieht immer so aus, als würde sie XML analysieren, da dies das von WCF verwendete Modell ist, auch wenn die Daten nicht wirklich XML sind. Im Falle von JSON wird der DataContractJsonSerialzer verwendet, aber selbst dieser erbt von XmlObjectSerializer und so kann der Stack es so aussehen lassen, als würde es mit XML arbeiten. Wenn Sie den kompletten Stack-Trace veröffentlichen könnten, der auch nützlich wäre. Alles andere an Ihrer Konfiguration sieht gut aus, aber mit enableWebScript dort müssen Sie dieses Wrapper-Objekt übergeben, wie ich schon sagte. Wenn Sie das enableWebScript entfernen, müssen Sie die Nachrichtencodierung tatsächlich selbst auf JSON setzen. –
Ich habe buchstäblich die Menge an Arbeit gesehen, die nötig war, um die "WCF Ajax Enabled" Dienste zu "Ajax Enabled" zu machen. –