Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我无法访问我的ApiController_C#_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

C# 我无法访问我的ApiController

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

我正在尝试创建一个用于登录的Api控制器,在使用我的
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")
    );
}