【问题标题】:Web Service not working in ASP.NET WebForms ajax callWeb 服务在 ASP.NET WebForms ajax 调用中不起作用
【发布时间】:2011-08-21 18:48:34
【问题描述】:

我正在尝试在客户端调用这样一个简单的 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" 的重写 URL 时,我收到以下错误:

用于访问路径的 HTTP 动词 POST '/service/local/newsservice.asmx/DoPost' 是不允许的。

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

DoPost Web 服务方法名称无效。

会发生什么?

【问题讨论】:

  • 在浏览器中调试和加载 Web 服务 URL 时会发生什么?您可以使用 ASP.NET 测试页发布数据吗?
  • 您是否尝试过删除[ScriptMethod] 属性,使用[WebMethod] 意味着接受POST 请求,而当您想使用GET 时,您会执行[ScriptMethod(UseHttpPost = true)] 之类的操作

标签: jquery ajax web-services webforms


【解决方案1】:

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

ServiceReference Class

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

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

  • 在 JavaScript 中向 Web 服务方法发出异步请求,

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

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

Exposing Web Services to Client Script

要从 [ASP.NET AJAX] 脚本启用 Web 服务调用,您必须注册 ScriptHandlerFactory 应用程序的 Web.config 中的 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 处理程序将调用委托给默认值 处理程序,它使用 SOAP 而不是 JSON 格式。代表团是 自动执行,您无需采取任何行动,除非 您想禁用 Web 服务的 SOAP 协议。 在这种情况下,您必须在 Web.config 文件。

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

【讨论】:

  • 在这篇文章之后,我创建了一个新服务并从该服务进行测试,它有效,后来尝试使它们相似,我意识到我的方法是静态的,因为我复制并粘贴了它它最初所在的网页。
  • @Nico - 这是一个很好的观点,而且很有道理!用PageMethod 属性修饰的网页方法需要是静态的才能从脚本中调用,但Web 服务方法应该是普通的公共方法。
【解决方案2】:

我认为问题在于使用

[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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2017-09-23
    • 1970-01-01
    • 2019-06-25
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多