【问题标题】:Simple POST with ASP.NET Framework使用 ASP.NET 框架的简单 POST
【发布时间】:2019-03-31 09:00:59
【问题描述】:

这是我的问题,我想通过POST请求接收客户端的用户名和密码。

代码看似简单,但行不通

LoginController.cs

public class LoginController : ApiController
{
    [HttpPost]
    [ActionName("Login")]
    [Route("api/{controller}")]
    public HttpResponseMessage Login([FromBody] LoginJson json)
    {
        return Request.CreateResponse(HttpStatusCode.OK);
    }
}

LoginJson.cs 表单:

public class LoginJson
{
    public string Username { get; set; }
    public string Password { get; set; }
}

ajax 请求带有jQuery,我不想更改网址,因为我想为 3 个不同的控制器使用 3 个网址 /api/Login/api/Method1/api/Method2

$.ajax({
        url: '/api/Login',
        type: 'POST',
        dataType: "json",
        contentType: "application/json, charset=utf-8",
        data: JSON.stringify({
            Username: username,
            Password: password,
        }),
        ...
});

API 的路由,在Global.asax.cs

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalFilters.Filters.Add(new HandleErrorAttribute());
    RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    RouteTable.Routes.MapRoute(...)


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

我收到错误 404 (Not Found)。 我将更改Global.asax.cs 文件。

【问题讨论】:

  • ApiController 来自 ASP.NET Web API。 AJAX 来自 AJAX。请不要删除有用的标签。
  • 看起来这对于属性路由来说是完美的。 blogs.msdn.microsoft.com/webdev/2013/10/17/…
  • @mason 你能帮我建议你的答案吗?我尝试了不同的可能性,例如您链接中的提示,但我仍然有404 (Not found)
  • 我提供的文档清楚地描述了如何设置属性路由。

标签: c# ajax asp.net-mvc asp.net-web-api


【解决方案1】:

您只是在没有任何操作的情况下调用控制器,并且由于没有定义默认操作,您将收到 404 错误。

在jQuery中你可以这样做:

url: '/api/Login/Login'

或者通过放置这个标签来改变路由:

[Route("api/login")]

或者在 RouteConfig.cs 中,这应该在设置其他路由(包括通用路由)之前完成。

routes.MapRoute("Login", "Login/{action}",
        defaults: new { controller = "Login", action = "Login" });

【讨论】:

  • 我不想从 jQuery 更改 url,[ActionName("api/login")] 不起作用,你忘记了最后一个选项
  • @Rodrigue 我已经添加了如何在 RouteConfig.cs 中添加它
  • 您的意思是将默认控制器设置为 Login ?这是个坏主意。它只会在稍后与其他 Controller 类一起带回问题。如果我有 3 个不同的控制器;我只想将/api/Login/api/Action1/api/Action2 作为我的POST 请求的网址。无论如何都没有解决办法
  • 只有当您执行/Login 时,才没有将默认控制器设置为Login。所以其他控制器将与他们一样工作。忘了提到你必须把它放在RouteConfig 中的其他路由之前,否则通用的将接管。
  • 抱歉,您的回答对我来说仍然不够,我无法得到除404 (Not found) 之外的其他错误代码。请问能不能给个更完整的答案?
【解决方案2】:

没有api/login

你可以这样做:

[ActionName("api/login")]
public HttpResponseMessage Login([FromBody] LoginJson json)
{
    return Request.CreateResponse(HttpStatusCode.OK);
}

【讨论】:

  • 不工作。我想为 3 个不同的控制器使用网址:/api/Login/api/Method1/api/Method2
猜你喜欢
  • 2011-01-06
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多