这是我的UI,使用ajax将数据发布到网络api。
<form id="myForm" method="post">
Username <input name="Email" id="Email" type="text" /> <br />
Password <input name="Password" id="Password" type="text" /> <br />
Confirm Password <input name="ConfirmPassword" id="ConfirmPassword" type="text" /> <br />
<input id="btnRegister" type="submit" value="Register" />
</form>
<script>
$(function () {
$('#btnRegister').click(function () {
debugger
var sForm = $('#myForm').serialize();
$.ajax({
type: 'POST',
url: 'https://localhost:44358/api/Account/Register',
contentType: "application/json",
dataType: "json",
data: sForm,
success: function () {
alert('Success');
},
error: function (xhr, status, error) {
}
})
})
})
</script>
在我的Web API中,我有此操作方法。
// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
return GetErrorResult(result);
}
return Ok();
}
使用邮递员,我已经对其进行了测试,并且可以正常工作。我可以插入数据库,但是如果我是从html发送的,则会遇到上述错误。
我的RegisterBindingModel:
public class RegisterBindingModel
{
[Required]
[Display(Name = "Email")]
public string Email { get; set; }
[Required]
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
在同一项目中添加了另一个普通控制器进行测试。它通过ModelState
,但以粗体显示在行上。
[HttpPost]
public ActionResult Register(RegisterBindingModel registerBindingModel)
{
if (!ModelState.IsValid)
{
return View();
}
using (var client = new HttpClient())
{
**HttpResponseMessage responsePost = GlobalVariables.WebApiClient.PostAsJsonAsync("Account/Register", registerBindingModel).Result;**
if (responsePost.IsSuccessStatusCode)
{
// Get the URI of the created resource.
Uri returnUrl = responsePost.Headers.Location;
if (returnUrl != null)
{
ViewBag.Message = "Added";
}
}
else
{
ViewBag.Message = "Internal server Error: " + responsePost.ReasonPhrase;
}
}
return View();
}
GlobaVariable:
public class GlobalVariables
{
public static HttpClient WebApiClient = new HttpClient();
static GlobalVariables()
{
WebApiClient.BaseAddress = new Uri("http://localhost:44358/api/");
WebApiClient.DefaultRequestHeaders.Clear();
WebApiClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
}
任何人都可以在这里提供一些线索吗?
答案 0 :(得分:1)
不允许的方法是您尝试进行发布,获取信息等。
在端点上添加标签[HttpPost]
。
// POST api/Account/Register
[AllowAnonymous]
[HttpPost]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
return GetErrorResult(result);
}
return Ok();
}
答案 1 :(得分:1)
之所以发生这种情况,是因为最初并未遵循默认的路由约定,而是在更正了基本URL之后,API开始起作用。根据规格:
在ASP.NET Web API中,控制器是处理HTTP请求的类。控制器的公共方法称为动作方法或简称为动作。 Web API框架收到请求后,会将请求路由到操作。
为了确定要调用的操作,框架使用路由表。用于Web API的Visual Studio项目模板创建默认路由:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
因此,当您需要调用API时,您的基本网址应带有/api
。