在webservice中使用Jquery AJAX调用方法时,我尝试使用从实体数据模型生成的webservice返回POCO类作为JSON。但我有错误的问题“只能从脚本中调用类定义中带有[ScriptService]属性的Web服务”,并且卡在其中,
这是我的代码:
namespace CarCareCenter.Web.Admin.Services
{
/// <summary>
/// Summary description for About
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class About : System.Web.Services.WebService
{
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
[WebMethod]
public static Entities.Category getAbout()
{
Entities.Category about = new Entities.Category();
using (var context = new CarCareCenterDataEntities())
{
about = (from c in context.Categories where c.Type == "About" select c).SingleOrDefault();
}
return about;
}
}
}
aspx页面:
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
url: '/Services/About.asmx/getAbout',
data: '{}',
success: function (response) {
var aboutContent = response.d;
alert(aboutContent);
$('#title-en').val(aboutContent.Name);
$('#title-vn').val(aboutContent.NameVn);
$('#content-en').val(aboutContent.Description);
$('#content-vn').val(aboutContent.DescriptionVn);
$('#id').val(aboutContent.CategoryId);
},
failure: function (message) {
alert(message);
},
error: function (result) {
alert(result);
}
});
$('#SaveChange').bind('click', function () { updateAbout(); return false; });
$('#Reset').bind('click', function () { getAbout(); return false; })
});
function updateAbout() {
var abt = {
"CategoryId": $('#id').val(),
"Name": $('#title-en').val(),
"NameVn": $('#title-vn').val(),
"Description": $('#content-en').val(),
"DescriptionVn": $('#content-vn').val()
};
$.ajax({
type: "POST",
url: "AboutManagement.aspx/updateAbout",
data: JSON.stringify(abt),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
var aboutContent = response.d;
$('#title-en').val(aboutContent.Name);
$('#title-vn').val(aboutContent.NameVn);
$('#content-en').val(aboutContent.Description);
$('#content-vn').val(aboutContent.DescriptionVn);
},
failure: function (message) {
alert(message);
},
error: function (result) {
alert(result);
}
});
}
</script>
有任何方法可以解决吗?请帮我 。感谢
答案 0 :(得分:51)
只需添加属性类 [ScriptService]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
答案 1 :(得分:5)
答案 2 :(得分:3)
我刚才有同样的错误消息:“只能从脚本中调用类定义中带有[ScriptService]属性的Web服务。”,但它有完全不同的原因和解决方案。
它正在我的开发机器上工作,但不在生产中。
在我的web.config中,我有:
<system.web>
<httpHandlers>
<remove verb="*" path="*.asmx"></remove>
<add verb="*" path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35"></add>
</httpHandlers>
</system.web>
将Add标记替换为较新的程序集版本:
<add verb="*" path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
它有效!显然,较旧的程序集(1.0.61025.0)没有重新识别针对较新的(3.5.0.0)编译的属性。
希望我可以节省一些我需要的时间来达到这个时间的底部!
答案 3 :(得分:0)
只是添加此内容,以防其他人犯了与我相同的愚蠢错误。
解决方案:在Visual Studio的解决方案资源管理器中右键单击.asmx文件,然后选择“查看标记”。验证Class属性的值正确并且没有指向错误的类。由于某些原因,CodeBehind文件和类名称的不匹配将引发此错误,而不是更相关的错误。
背景故事:处理遗留代码,并希望使用.asmx Web服务来与其余代码库保持一致。在VS2017中,我找不到在哪里添加该文件,因此我只是复制了另一个.asmx文件并将其重命名。我应该知道的更好。由于在解决方案资源管理器中双击.asmx时,直接将您带到文件后面的代码,因此该问题被稍微掩盖了,因此很容易忽略重命名文件并不会更新Class属性。
答案 4 :(得分:0)
我也面临着同样的问题。
我只是在下面的代码中发表了评论,它开始起作用:
[System.Web.Script.Services.ScriptService]
在.asmx文件中可用。