Ответ 1
просто добавьте класс атрибута [ScriptService]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
Я пытаюсь использовать возвращаемый класс webservice POCO, сгенерированный из модели данных сущности, как JSON при использовании метода вызова JQuery AJAX в webservice. но у меня проблема с ошибкой "Только веб-сервисы с атрибутом [ScriptService] в определении класса можно вызывать из script" и застревать в нем,
Вот мой код:
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>
Есть ли какие-либо подходы к его решению? Пожалуйста, помогите мне. Благодаря
просто добавьте класс атрибута [ScriptService]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
старый вопрос. у меня была такая же проблема, просто удалил contenttype из ajax-звонка, и он сработал.
У меня просто было такое же сообщение об ошибке: "Только веб-сервисы с атрибутом [ScriptService] в определении класса можно вызывать из script.", но у него была совершенно другая причина и решение.
Он работал над моей машиной разработки, но не в производстве.
В моем 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).
Надеюсь, я смогу сэкономить кому-то часы, которые мне нужны, чтобы добраться до сути этого!
Просто добавлю это на тот случай, если кто-то еще совершит ту же глупую ошибку, что и я.
Решение. Щелкните правой кнопкой мыши файл .asmx в обозревателе решений Visual Studio и выберите "Просмотреть разметку". Убедитесь, что значение атрибута Class является правильным и не указывает на неправильный класс. По какой-то причине несоответствие файла CodeBehind и имени класса вызовет эту ошибку вместо чего-то более значимого.
История вопроса: работа над унаследованным кодом и использование веб-службы .asmx для обеспечения согласованности с остальной частью кода. В VS2017 я не мог найти, куда добавить этот файл, поэтому я просто скопировал другой файл .asmx и переименовал его. Я должен был знать лучше. Эта проблема слегка замаскирована, потому что вы попадаете прямо в код, стоящий за файлом, когда дважды щелкаете на .asmx в обозревателе решений, поэтому легко упустить из виду, что переименование файла не обновляет атрибут Class.