我有这个'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方法并且它正常工作,这实际上就是那个初始化的帖子。
答案 0 :(得分:0)
我认为这个错误有两个原因:
如果您想确保调用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},
如果这没有帮助,请告诉我。