【问题标题】:How do you make an ASP.Net 3.5 WebService accept AJAX PUT requests?如何让 ASP.Net 3.5 WebService 接受 AJAX PUT 请求?
【发布时间】:2013-03-24 19:57:51
【问题描述】:

我无法在 ASP.Net 3.5 项目中获取 WebService 来接受 PUT 请求。

这里是 AJAX 调用:

var url = '/MyService.asmx/UpdateObject';
var options = {
    dataType: "json",
    contentType: "application/json",
    cache: false,
    type: "PUT",
    data: data ? ko.toJSON(data) : null
};

$.ajax(url, options);

在 MyService.asmx 中,我有以下内容:

[WebMethod(EnableSession = true)]
[System.Web.Script.Services.ScriptMethod(ResponseFormat = System.Web.Script.Services.ResponseFormat.Json, UseHttpGet=true)]
public ButDto UpdateObject(ObjectDto myObject)
{
    //Do some stuff here

    return myObject;
}    

但是,我收到以下错误消息:

尝试使用 POST 调用方法 UpdateObject 请求,这是不允许的。

如果我从我的 Web 服务声明中删除“, UseHttpGet=true”并执行相同的 ajax 调用,我会收到以下错误消息:

尝试使用 GET 调用方法 UpdateObject 请求,这是不允许的。

所以我在这里有点困惑。

更新

我也尝试了 dataType: "text",但结果是一样的。

【问题讨论】:

    标签: jquery ajax web-services asp.net-3.5 put


    【解决方案1】:

    看看MSDN,POST 和 GET 是唯一可接受的带有 ScriptMethod 的 HTTP 动词。

    作为您收到错误的原因。如果在发送 AJAX 请求时将 JSON 数组放入 data 属性,jQuery 会将其序列化为查询字符串并将其发送到服务器。但这不是 ASP.NET 所要寻找的。您需要向 jQuery 传递您要使用的 JSON 字符串。喜欢:

    var url = '/MyService.asmx/UpdateObject';
    var options = {
        dataType: "json",
        contentType: "application/json; charset=utf-8",  // add charset for good measure
        cache: false,
        type: "POST",
        data: "{'id':2, 'name':'foobar'}"  // notice the quotes here
    };
    
    $.ajax(url, options);
    

    如果您想将 Javascript 对象转换为完成请求所需的 JSON 字符串,您可以使用 JSON2 中的 JSON.stringify()

    如果您想了解更多信息,请查看http://encosia.com/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/,其中包含很多关于一些常见错误的信息。

    【讨论】:

    • 感谢 Steven 提供的信息和好的建议!我想我可以使用 POST 来更新实体。但是,根据我的阅读,应该使用 POST 来创建实体,并使用 PUT 来更新它们。遗憾的是微软的 ScriptMethod 不接受 PUT 和 DELETE 请求。是否有另一种方法可以编写可以接受 PUT 请求的 ASP.Net 3.5 Web 服务?
    • @Jean-FrançoisBeauchamp 在 RESTful 设置中,您完全正确,PUT 将替换/更新实体。我认为使用 POST 请求创建/更新实体也是可以接受的。要接受 PUT,我认为您需要在 Web 服务之外编写一些内容。也许是一个通用处理程序?但是如果你走这条路,你会失去一些网络服务提供的自动序列化和映射。
    • 感谢您的回复!我终于将 POST 用于有关插入、更新和删除的所有内容。
    猜你喜欢
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2017-02-19
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2013-01-13
    相关资源
    最近更新 更多