C# Web API Post错误-HTTP错误405.0-不允许使用方法

C# Web API Post错误-HTTP错误405.0-不允许使用方法,c#,rest,api,http,asp.net-ajax,C#,Rest,Api,Http,Asp.net Ajax,这是我的UI,它使用ajax将数据发布到web 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

这是我的UI,它使用ajax将数据发布到web 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>
在同一项目中添加了另一个要测试的普通控制器。它通过
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();
    }
全球可变:

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"));
    }
}

任何人都可以在这里提供一些线索?

不允许的方法是在您尝试发布帖子、获取等时使用

在端点上添加标签
[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();
}
//发布api/帐户/注册
[异名]
[HttpPost]
[路线(“登记”)]
公共异步任务寄存器(RegisterBindingModel模型)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
var user=new ApplicationUser(){UserName=model.Email,Email=model.Email};
IdentityResult result=await UserManager.CreateAsync(用户、模型、密码);
如果(!result.successed)
{
返回GetErrorResult(结果);
}
返回Ok();
}

不允许使用的方法是当您尝试发布、获取等

在端点上添加标签
[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();
}
//发布api/帐户/注册
[异名]
[HttpPost]
[路线(“登记”)]
公共异步任务寄存器(RegisterBindingModel模型)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
var user=new ApplicationUser(){UserName=model.Email,Email=model.Email};
IdentityResult result=await UserManager.CreateAsync(用户、模型、密码);
如果(!result.successed)
{
返回GetErrorResult(结果);
}
返回Ok();
}

之所以发生这种情况,是因为最初没有遵循默认路由约定,但在更正了基本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时,您的基本url应该具有
/API

这是因为最初没有遵循默认的路由约定,但在您更正了基本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时,您的基本url应该有
/API

因为如果您的ModelState无效,您将返回一个HTTP 405,我将首先检查它。您跟踪了HTTP请求吗?我尝试使用use test创建另一个mvc ui项目。ModelState为true。由于如果ModelState无效,则返回HTTP 405,因此我将首先检查它。您跟踪了HTTP请求吗?我尝试使用use test创建另一个mvc ui项目。ModelState是真的。我刚刚尝试过,但在register.html和mvc上都无法运行。即使我没有
[HttpPost]
,如果我使用Post方法从邮递员那里发送数据,它怎么会起作用呢?在我将web api url更改为添加
https
后,它现在返回错误的请求。在我将
api
移动为
“/api/Account/Register”后,它现在起作用了
我也不确定我刚才尝试了什么,但它在register.html和mvc上都无法运行。即使我没有
[HttpPost]
,如果我使用Post方法从邮递员那里发送数据,它怎么会起作用呢?在我将web api url更改为添加
https
后,它现在返回错误的请求它在我将
api
移动为
“/api/Account/Register”
后起作用,我也不知道为什么