从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它为我工作,也是关于铬浏览器,你必须添加扩展工作在铬,但我不知道的扩展名

下面的步骤解决了我的问题,希望它有助于一个人,

  1. 为了允许从脚本调用这个Web服务,使用ASP.NET AJAX,例如在asmx服务类上面包含以下行

    [System.Web.Script.Services.ScriptService] public class GetData:System.Web.Services.WebService {

  2. 在web.config的system.web下添加协议,如果无法查看configuration,请点击链接

https://pastebin.com/CbhjsXZj

 <system.web> <webServices> <protocols> <add name="HttpGet"/> <add name="HttpPost"/> </protocols> </webServices>