Jquery Web服务在ASP.NET WebForms ajax调用中不起作用

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) {

我试图在客户端调用这样一个简单的web服务:

$.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方法的输入参数

由于您使用的是jQuery而不是为ASP.NET AJAX创建的代理对象,因此可能需要检查以下几项配置是否正确:

要从[ASP.NET AJAX]脚本启用Web服务调用,必须注册 应用程序的Web.config中的ScriptHandlerFactory HTTP处理程序 文件处理程序处理从脚本到.asmx Web的调用 服务。以下示例显示了的Web.config元素 添加处理程序

这些配置设置已经是Web.config文件的一部分 在中创建的任何支持AJAX的新网站的模板 微软VisualStudio2005


对于不是从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>