Web服务无法在ASP.NET WebForms ajax调用中工作

时间:2011-08-21 18:48:35

标签: 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) {
        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);
    }
}

使用指向"/service/local/newsservice.asmx/DoPost"的重写网址时,出现以下错误:

  

用于访问路径的HTTP谓词POST   

当我使用普通URL时,我得到了这个(通过Firebug,应用程序静默失败):

  

DoPost Web服务方法名称无效。

可能会发生什么?

2 个答案:

答案 0 :(得分:1)

在ASP.NET中调用Web服务的内置方法是使用服务引用,该引用为您创建JavaScript对象以调用Web服务方法。

  

ServiceReference Class

     

要从ECMAScript(JavaScript)调用Web服务方法,您必须   在ASP.NET页面中包含一个服务引用并应用   ScriptServiceAttribute属性为Web服务类定义。   如果在Web中包含对Web服务的服务引用   ASP.NET页面内的ScriptManager或ScriptManagerProxy控件,   JavaScript对象将在浏览器中实例化。

     

代理对象将用于执行以下操作:

     
      
  • 使用JavaScript向Web服务方法发出异步请求,

  •   
  • 初始化服务器数据类型的代理实例   特别适合用作调用Web方法的输入参数。

  •   

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

  

Exposing Web Services to Client Script

     

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

     
    

这些配置设置已经是Web.config文件的一部分     您在其中创建的任何新的启用AJAX的网站的模板     Microsoft Visual Studio 2005。

  
<system.web>   
  <httpHandlers>
    <remove verb="*" path="*.asmx"/> 
    <add verb="*" path="*.asmx" 
      type="System.Web.Script.Services.ScriptHandlerFactory"
      validate="false"/>   
  </httpHandlers> 
<system.web>
     

对于非ASP.NET AJAX脚本发出的Web服务调用,   ScriptHandlerFactory处理程序将调用委托给默认值   handler,使用SOAP而不是JSON格式。代表团是   自动执行,您不必采取任何行动,除非   您希望禁用Web协议的SOAP协议。   在这种情况下,您必须在中输入以下配置设置   Web.config文件。

<system.web>   
  <webServices>
    <protocols>
      <clear/>
    </protocols>   
  </webServices> 
</system.web>

答案 1 :(得分:0)

我认为问题在于使用

[ScriptMethod]

你真的需要它吗?

同时检查这可能会有所帮助:[ScriptMethod]

http://msdn.microsoft.com/en-us/library/system.web.script.services.scriptmethodattribute.aspx

http://msdn.microsoft.com/en-us/library/byxd99hx(v=vs.71).aspx