C# 我无法访问我的ApiController
我正在尝试创建一个用于登录的Api控制器,在使用我的C# 我无法访问我的ApiController,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我正在尝试创建一个用于登录的Api控制器,在使用我的CustomerController(Api)访问数据之前,应该先使用该控制器 问题是,当我尝试在AccountController上访问我的登录方法时,我遇到了404错误。我正试图发布到AccountController,如下面的屏幕截图所示 有趣的是,通过将浏览器指向http://localhost:62655/api/customer/cvr/88888888我是否错过了POST请求的约定或其他内容? 我的WebApi路由配置是: pub
CustomerController
(Api)访问数据之前,应该先使用该控制器
问题是,当我尝试在AccountController
上访问我的登录方法时,我遇到了404错误。我正试图发布到AccountController
,如下面的屏幕截图所示
有趣的是,通过将浏览器指向http://localhost:62655/api/customer/cvr/88888888
我是否错过了POST请求的约定或其他内容?
我的WebApi路由配置是:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
并添加到my Global.asax中:
WebApiConfig.Register(GlobalConfiguration.Configuration);
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
我的AccountController和CustomerController看起来是这样的(为了简洁起见合并了文件):
Web API方法以其类型开始,例如重命名方法postcvr,这将自动映射到post
这是因为您没有定义控制器的操作是[HttpGet]还是[HttpPost]。在您的情况下,您的登录操作应该如下所示
[HttpPost]
public async Task<HttpResponseMessage> Login([FromBody]LoginApiViewModel model)
{
if (!ModelState.IsValid) return Request.CreateResponse(HttpStatusCode.BadRequest, "Username or password is not supplied");
var user = UserManager.Find(model.Username, model.Password);
if (user != null && UserManager.IsInRole(user.Id, "Administrator"))
{
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity);
var response = Request.CreateResponse(HttpStatusCode.OK, "Success");
return response;
}
return Request.CreateResponse(HttpStatusCode.Unauthorized, "Wrong login");
}
[HttpPost]
公共异步任务登录([FromBody]LoginApiViewModel模型)
{
如果(!ModelState.IsValid)返回Request.CreateResponse(HttpStatusCode.BadRequest,“未提供用户名或密码”);
var user=UserManager.Find(model.Username,model.Password);
if(user!=null&&UserManager.IsInRole(user.Id,“管理员”))
{
var identity=await UserManager.CreateIdentityAsync(用户,DefaultAuthenticationTypes.ApplicationOkie);
SignIn(新的AuthenticationProperties(){IsPersistent=true},标识);
var response=Request.CreateResponse(HttpStatusCode.OK,“成功”);
返回响应;
}
return Request.CreateResponse(HttpStatusCode.Unauthorized,“错误登录”);
}
您还需要为CVR操作提供[HttpGet]。将您的配置更改为如下所示…这里我在MVC路由之前移动了web api路由…这是因为web api路由比通用MVC路由更具体
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutoMapperWebConfiguration.Configure();
}
在Api类中,使用路由表示法 [路由(“api/[控制器]”)] 公共类WebApicController:ApicController { 在WebApiConfig.cs中:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { controller = "WebApi", id = RouteParameter.Optional }
);
//FOR User JSON format
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(
new MediaTypeHeaderValue("application/json")
);
}
webapi不知道您的Login()方法支持从帐户控制器、路由和请求的外观来支持POST。它们看起来很好,您应该已经收到了响应…404响应的正文中有哪些详细信息?…顺便说一句,更改
WebApiConfig.Register(GlobalConfiguration.Configuration)
到全局配置.Configure(WebApiConfig.Register);
即使我将操作重命名为:Login([FromBody]LoginApiViewModel model)我仍然收到一个404。更新了带有响应堆栈strace的帖子。还更改了Global.asax,没有任何luckI将其重命名为PostLogin,没有任何运气。客户控制器正在按其应该的方式工作,但是是的-也许最好将该操作重命名为GetCVR。也许您指的是将登录操作重命名为:Login([FromBody]LoginApiViewModel模型)?似乎仍然不走运:(在本例中,它隐含为POST,因此如果动作名称的前缀没有“Get”、“POST”等动词,则无需说PostLogin
等等…默认值是POST,因此您不需要显式地用HttpPost
attributes来修饰。我完全不理解这一点,CustomerController使用GET可以很好地命中,但是帐户只是一个404错误。您能试着用GET方法命中帐户吗?GET也会返回一个404。是的!这是正确的t!现在我正在点击我的控制器!5个小时的挖掘终于解决了,哈哈。这也帮助了我,我不得不移动我的GobalConfiguration。在我的RouteConfig调用和presto之前,配置调用,我可以访问我的webapi控制器无错误。这也帮助了我,我还不得不删除一个webapi配置,因为存在冲突在MVC路由和api路由之间。完美的解决方案!如果我的代码没有触发任何其他方法呢?
// GET api/values
[HttpGet]
[Route("api/webapi")] //ROUTE <-- Work for me
public IEnumerable<ProductViewData> Get()
{
//CODE
}
// POST api/values
[HttpPost]
[Route("api/webapi/save")] //ROUTE <-- Work for me
public IHttpActionResult Post(ProductViewData product)
{
//CODE
}
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { controller = "WebApi", id = RouteParameter.Optional }
);
//FOR User JSON format
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(
new MediaTypeHeaderValue("application/json")
);
}