我试图从jQuery调用ASMX方法但没有成功。以下是我的代码,我不明白我错过了什么。
File 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);
}
File 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?";
}
}
答案 0 :(得分:25)
最突出的一点是你有UseHttpGet=true
,但在你的jQuery代码中你正在使用POST。
这里是我创建的一个测试页面,调用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>
答案 1 :(得分:6)
您必须确保将Json指定为响应格式,如果这是您想要的并且由于security features而摆脱UseHttpGet
:
[WebMethod]
[ScriptMethod(ResponseFormat=ResponseFormat.Json)]
public string GetSurvey() {
return "Question: Who is Snoopy?";
}
答案 2 :(得分:2)
以下是对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
});
答案 3 :(得分:2)
我遇到了这个问题并遇到了同样的问题。我通过添加:
解决了这个问题[WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)]
在您的网络方法属性下方,如果您想使用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?";
}
}
答案 4 :(得分:1)
我还建议删除UseHttpGet,就像Jim Scott建议的那样。
您可以在选项中添加以下内容,并检查objXMLHttpRequest以查看更详细的错误响应。
error: function(objXMLHttpRequest, textStatus, errorThrown) {
debugger;
}
答案 5 :(得分:1)
您必须确保将Json指定为响应格式,如果这是您想要的并且由于安全功能而摆脱UseHttpGet:
如果您阅读该文章,那么您会发现使用UseHttpGet是安全的,因为ASP.NET具有阻止跨站点脚本攻击向量的功能。
使用GET有很多正当理由。
他可以删除数据参数并将POST更改为GET以使调用工作。假设您需要JSON响应,则还需要添加ResponseFormat = ResponseFormat.Json。
答案 6 :(得分:1)
以下步骤解决了我的问题,希望它有所帮助,
要允许使用ASP.NET AJAX从脚本调用此Web服务,请在asmx服务类上方添加以下行,例如
[System.Web.Script.Services.ScriptService] 公共类GetData:System.Web.Services.WebService {
在web.config中添加system.web下的协议,如果您无法查看配置,请点击链接
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
答案 7 :(得分:0)
如果您尝试使用Chrome浏览器,请尝试使用Internet Explorer,它对我有用,而且它是关于Chrome浏览器的,您必须在chrome中添加扩展名,但我不知道扩展名称