我意识到这里已经有很多类似的问题,但是我无法弄清楚。
我有一个Web服务(C#,. net 3.5)。您需要了解的基本代码如下:
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class WSMember : System.Web.Services.WebService { public WSMember () { } [WebMethod] [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public string GetMember(string IdMember) { //Ignore the parameter for now... I will be looking up a database with it... //For now just return a minimal object: Member m = new Member(); m.Surname = "Smith"; m.FirstName = "John"; return new JavaScriptSerializer().Serialize(m); }
另外,在web.config中,我做了以下添加(我刚刚在其他帖子上看到了……这是正常/安全吗?)
<webServices> <protocols> <add name="HttpGet" /> <add name="HttpPost" /> </protocols> </webServices>
然后在Default.aspx中,我有两个主要参考…
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script type="text/javascript" src="jquery.json-2.2.min.js" ></script>
从Google代码下载了jquery.json-2.2.min.js
这是Javascript:
<script type="text/javascript"> $(document).ready(function() { $("#button1").click(function(event) { var myData = { IdMember: "2" }; var encoded = $.toJSON(myData); alert(encoded); $.ajax({ type: "POST", url: "WSMember.asmx/GetMember", data: encoded, contentType: "application/json; charset=utf-8", dataType: "json", success: function(msg) { alert("worked" + msg.d); //$("#sidebar").append(msg); }, error: function(msg) { alert(msg.d); //$("#sidebar").append(msg); } }); }); }); </script>
当我执行它时,编码的json会按预期出现在消息框中…即用双引号引起来:
{“ IdMember”:“ 2”}
但是,它总是失败。即使对于没有数据传递的最基本的Hello World,它也会失败。我不断收到消息数据的“未定义”。
如果我仅使用alert(msg),它将显示[object XMLHttpRequest]
有人知道我的数据丢失了吗?
还有另一个问题……我在做什么,根本上有什么不对吗?
非常感谢。
编辑:
谢谢你们的回复。我尝试了以下方法…
UseHttpGet = true现在更改为false。(再次-我在某处看到它,所以尝试了…但是我知道它可能不正确:-/)
假设Web服务现在返回一个字符串。我按如下方式构建字符串(似乎有些疯狂……对其进行序列化确实做了同样的事情……)
StringBuilder sb = new StringBuilder(); sb.Append("{"); sb.Append("\"Surname\":"); sb.Append("\""); sb.Append(m.Surname); sb.Append("\""); sb.Append(",\"FirstName\":"); sb.Append("\""); sb.Append(m.FirstName); sb.Append("\""); sb.Append("}"); return sb.ToString();
这段代码返回如下内容:
{"Surname":"Smith","FirstName":"John"}
我仍然收到完全相同的错误…
我还尝试过类似返回对象“ Member”的操作,因此代码变为:
[WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public Member GetMember(string IdMember) { Member m = new Member(); m.Surname = "Smith"; m.FirstName = "John"; return m; }
这也会引发相同的错误。
对不起,很痛苦…我已经阅读了这些链接和其他链接。只是看不出为什么这有什么不同。
我是否需要了解任何其他配置设置?
非常感谢您的答复。
更新: 问题已解决。上面代码中的主要错误是:
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
应该
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
另外,在表单上,当使用按钮调用javascript时,我错误地设置了输入类型…
<input id="button1" type="submit" value="Just a test" />
什么时候 应该 说:
<input id="button1" type="button" value="Just a test" />
非常感谢所有帮助的人。
在我看来,您尝试手动使用JavaScriptSerializer().Serialize而不是返回对象的主要问题。来自Web服务的响应将采用双JSON编码。
JavaScriptSerializer().Serialize
你是对的!有很多密切的问题。看这里如果ContentType不是JSON,我可以从.asmx Web服务返回JSON吗?并且无法获取jQuery Ajax来解析JSONWeb服务结果,您将(我希望)找到答案。
更新 :抱歉,您在未发布的地方有一个小错误。为了解决该问题,我用旧版本的Visual Studio(VS2008)创建了一个小项目,该项目实际上具有您的代码并且可以正常工作。我将其放在http://www.ok-soft- gmbh.com/jQuery/WSMember.zip上。您可以下载,编译并验证它是否可以工作。然后,您可以将代码与我的代码进行比较,并找到错误。
最好的祝福