从jQuery调用ASMX
我想从jQuery调用一个ASMX方法没有成功。 以下是我的代码,我不明白我缺less什么。
文件Something.js,
function setQuestion() { $.ajax({ type: "POST", data: "{}", dataType: "json", url: "http: //localhost/BoATransformation/Survey.asmx/GetSurvey", contentType: "application/json; charset=utf-8", success: onSuccess }); } function onSuccess(msg) { $("#questionCxt").append(msg); }
文件SomethingElse.cs,
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class Survey : System.Web.Services.WebService { public Survey () { } [WebMethod] [ScriptMethod(UseHttpGet = true)] public string GetSurvey() { return "Question: Who is Snoopy?"; } }
有一点突出是你有UseHttpGet=true
但在你使用POST的jQuery代码。
另外这里是我创build的一个testing页面,调用一个ASMX页面。
[WebMethod] public Catalog[] GetCatalog() { Catalog[] catalog = new Catalog[1]; Catalog cat = new Catalog(); cat.Author = "Jim"; cat.BookName ="His Book"; catalog.SetValue(cat, 0); return catalog; } <script type="text/javascript"> $(document).ready(function() { $.ajax({ type: "POST", url: "default.asmx/GetCatalog", cache: false, contentType: "application/json; charset=utf-8", data: "{}", dataType: "json", success: handleHtml, error: ajaxFailed }); }); function handleHtml(data, status) { for (var count in data.d) { alert(data.d[count].Author); alert(data.d[count].BookName); } } function ajaxFailed(xmlRequest) { alert(xmlRequest.status + ' \n\r ' + xmlRequest.statusText + '\n\r' + xmlRequest.responseText); } </script>
你必须确定你指定了Json作为响应格式,如果这是你想要的并且由于安全特性摆脱UseHttpGet
:
[WebMethod] [ScriptMethod(ResponseFormat=ResponseFormat.Json)] public string GetSurvey() { return "Question: Who is Snoopy?"; }
我遇到了这个问题,并有同样的问题。 我解决了它通过添加:
[WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)]
在你的web方法属性下面,如果你想使用POST。 即:
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class Survey : System.Web.Services.WebService { public Survey () { } [WebMethod] [WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)] [ScriptMethod(UseHttpGet = true)] public string GetSurvey() { return "Question: Who is Snoopy?"; } }
我也build议像Jim Scottbuild议的那样去除UseHttpGet。
您可以将以下内容添加到您的选项中,并检查objXMLHttpRequest以查看更详细的错误响应。
error: function(objXMLHttpRequest, textStatus, errorThrown) { debugger; }
下面是一个在aspx上调用页面方法的jQuery示例,但它与asmx页面类似。
$.ajax( { type: "POST", url: "NDQA.aspx/ValidateRoleName", data: '{"roleName":"' + $('[id$=RoleNameTextBox]').val() + '"}', contentType: "application/json; charset=utf-8", dataType: "json", success: ValidateSuccess, error: ValidateError });
你必须确定你指定了Json作为响应格式,如果这是你想要的并且由于安全特性摆脱UseHttpGet:
如果您阅读了这篇文章,那么您会发现使用UseHttpGet是安全的,因为ASP.NET具有阻止跨站点脚本攻击媒介的function。
有很多有效的理由来使用GET。
他可以删除数据参数并将POST更改为GET以使呼叫工作。 假设你想要一个JSON响应,那么也需要添加ResponseFormat = ResponseFormat.Json。
如果你尝试铬浏览器,尝试Internet Explorer它为我工作,也是关于铬浏览器,你必须添加扩展工作在铬,但我不知道的扩展名
下面的步骤解决了我的问题,希望它有助于一个人,
-
为了允许从脚本调用这个Web服务,使用ASP.NET AJAX,例如在asmx服务类上面包含以下行
[System.Web.Script.Services.ScriptService] public class GetData:System.Web.Services.WebService {
-
在web.config的system.web下添加协议,如果无法查看configuration,请点击链接
<system.web> <webServices> <protocols> <add name="HttpGet"/> <add name="HttpPost"/> </protocols> </webServices>