Jquery Web服务在ASP.NET WebForms ajax调用中不起作用
我试图在客户端调用这样一个简单的web服务:Jquery Web服务在ASP.NET WebForms ajax调用中不起作用,jquery,ajax,web-services,webforms,Jquery,Ajax,Web Services,Webforms,我试图在客户端调用这样一个简单的web服务: $.ajax({ type: "POST", url: "/service/local/newsservice.asmx/DoPost", // "/news/post/do", data: { title: _title, markdown: _markdown, categoryId: 1 }, success: function (data) {
$.ajax({
type: "POST",
url: "/service/local/newsservice.asmx/DoPost", // "/news/post/do",
data: {
title: _title,
markdown: _markdown,
categoryId: 1
},
success: function (data) {
alert("success!");
}
});
实际服务是:
[WebService(Namespace = "http://service.site.com/service/news")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[ScriptService]
public class NewsService : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod]
public static void DoPost(string title, string markdown, int categoryId)
{
if (!(Roles.IsUserInRole("Owner") || Roles.IsUserInRole("Administrator")))
return;
CommunityNews.Post(title, markdown, categoryId);
}
}
使用重写的URL(指向“/service/local/newsservice.asmx/DoPost”
)时,出现以下错误:
用于访问路径的HTTP谓词POST
不允许使用“/service/local/newservice.asmx/DoPost”
当我使用普通URL时,我会得到以下结果(通过Firebug,应用程序会自动失败):
DoPost Web服务方法名称无效
发生了什么事?我认为问题在于使用
[ScriptMethod]
你真的需要它吗
另外,请选中此选项可能会有所帮助:[ScriptMethod]
在ASP.NET中调用web服务的内置方式是使用服务引用,它创建JavaScript对象,供您调用web服务方法 要从ECMAScript(JavaScript)调用Web服务方法,必须 在ASP.NET页面中包含服务引用并应用 Web服务类定义的ScriptServiceAttribute属性。 如果在中包含对Web服务的服务引用 ASP.NET页面内的ScriptManager或ScriptManagerProxy控件, JavaScript对象将在浏览器中实例化 代理对象将用于执行以下操作:
- 在JavaScript中向Web服务方法发出异步请求
- 在中初始化服务器数据类型的代理实例 特别是用作调用Web方法的输入参数
对于不是从ASP.NET AJAX脚本发出的Web服务调用,
ScriptHandlerFactory处理程序将调用委托给默认
处理程序,它使用SOAP而不是JSON格式。代表团是
自动执行,您无需执行任何操作,除非
您希望禁用对Web服务使用SOAP协议。
在这种情况下,必须在中输入以下配置设置
Web.config文件
<system.web>
<webServices>
<protocols>
<clear/>
</protocols>
</webServices>
</system.web>
在浏览器中调试和加载web服务URL时会发生什么情况?你能用ASP.NET测试页面发布数据吗?你是否尝试过删除
[ScriptMethod]
属性,使用[WebMethod]
意味着接受发布
请求,当你想使用获取
时,你可以在这篇文章之后执行类似[ScriptMethod(UseHttpPost=true)]
的操作,我创建了一个新的服务并从中进行了测试,它成功了,几次尝试之后,我意识到我的方法是静态的,因为我从它最初所在的网页复制并粘贴了它。@Nico-这是一个很好的观点,很有意义!用PageMethod
属性修饰的网页方法需要是静态的,才能从脚本中调用,但Web服务方法应该是普通的公共方法。
<system.web>
<webServices>
<protocols>
<clear/>
</protocols>
</webServices>
</system.web>