称为GET而不是POST的方法

时间:2014-04-09 09:55:46

标签: asp.net-web-api asp.net-web-api-routing

我有这个'POST'方法

[HttpPost]
[System.Web.Mvc.ValidateAntiForgeryToken]
public HttpResponseMessage UpdateProfile(string sAppUser)
{
    MobileProfileModel profileModel= JsonConvert.DeserializeObject<MobileProfileModel>(sAppUser);
    using (ucApp = new UserControllerApplication())
    {
        //this code should match the
        bool success = ucApp.UpdateUserProfile(profileModel);
        var response = Request.CreateResponse<bool>(HttpStatusCode.Created, success);

        string uri = Url.Link("DefaultApi", new { result = success });
        response.Headers.Location = new Uri(uri);
        return response;
    }
}

我称之为AJAX'POST'

$.ajax({
    url: "http://mydomain.com/api/User/UpdateProfile",
    data:JSON.stringify(profile),
    type: 'POST',
    contentType: 'application/json',
    //dataType: "json",
    async: false,
    cache: false,
    success: function (data) {
         $.blockUI({ message: "Success" });
    },
    error: function (xhr) {
        alert(xhr.responseText);
    },  
    beforeSend: function() {
       $.blockUI({ message: $("#ajaxLoader") });
    },
    complete: function() {
       $.unblockUI();
    }
});

我即将收到此错误

<Error>
<Message>
The requested resource does not support http method 'GET'.
</Message>
</Error>

问题是我没有调用GET方法,并且该方法也没有被标记为GET。我不确定是什么问题。

更新 这些是我的路线定义

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    //specific route for just the public views
    routes.MapRoute(
    "publicview",
    "publicview/details/{userName}",
    new { controller = "publicview", action = "details", username = UrlParameter.Optional }
    );

    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

我正在同一个控制器上执行一个Get方法并且它正常工作,这实际上就是那个初始化的帖子。

2 个答案:

答案 0 :(得分:0)

我认为这个错误有两个原因:

  1. 您的服务器uri路由将您的请求路由到错误的方法
  2. 你的ajax请求正在调用错误的uri
  3. 如果您想确保调用POST,请通过wireshark查看或尝试使用其他工具进行发布(例如curl)

    <强>更新

    你的uri形式AJAX要求是:

    /api/User/UpdateProfile
    

    你的uri模板是:

    api/{controller}/{action}/{id}
    

    我认为你得到这个错误是因为它们不匹配。

    顺便说一下:你不应该使用post来更新个人资料,使用带有ID的PUT

    例如:

    $.ajax({
                url: "/api/User/UpdateProfile/"+UserID,
                data:JSON.stringify(profile),
                type: 'PUT',
                contentType: 'application/json',
                //dataType: "json",
                async: false,
                cache: false,
                success: function (data) {
                     $.blockUI({ message: "Success" });
                },
                error: function (xhr) {
                    alert(xhr.responseText);
                },  
                   beforeSend: function() {
                       $.blockUI({ message: $("#ajaxLoader") });
                   },
                   complete: function() {
                       $.unblockUI();
                   }
            });
    

    并在控制器中:

    [HttpPut]
        [System.Web.Mvc.ValidateAntiForgeryToken]
        public HttpResponseMessage UpdateProfile(string sAppUser) // I don't know how to parse the id from uri ;) 
        {
            //find the user by his uniqe ID
            MobileProfileModel profileModel= JsonConvert.DeserializeObject<MobileProfileModel>(sAppUser);
            using (ucApp = new UserControllerApplication())
            {
                //this code should match the
                bool success = ucApp.UpdateUserProfile(profileModel);
                var response = Request.CreateResponse<bool>(HttpStatusCode.Created, success);
    
                string uri = Url.Link("DefaultApi", new { result = success });
                response.Headers.Location = new Uri(uri);
                return response;
            }
        }
    

答案 1 :(得分:0)

这里有两件事,首先是你有没有理由在你的ajax请求中使用完整路径而不是绝对路径?这只是为了举例吗?我会向你推荐绝对的道路。

接下来,如果您可以在ajax调用中尝试此操作,请更改以下

url: "http://mydomain.com/api/User/UpdateProfile",

url: "/api/User/UpdateProfile/" + profile,

否则,如果您想在ajax调用中使用data:属性,请使用

data: {sAppUser: profile},

如果这没有帮助,请告诉我。