Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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# Web API 2不工作(404)_C#_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

C# Web API 2不工作(404)

C# Web API 2不工作(404),c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,我已经尝试了很长一段时间让WebAPI2工作。我在网上读了很多文章和帖子,但到目前为止我运气不好 我只需要使用简单的WebAPI方法,但由于某些原因,我仍然没有找到404方法。我现在真的不知道问题出在哪里,因为在我看来一切都很好 我尝试了很多属性、配置等的变化。我最终得到了以下代码: Global.asax AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

我已经尝试了很长一段时间让WebAPI2工作。我在网上读了很多文章和帖子,但到目前为止我运气不好

我只需要使用简单的WebAPI方法,但由于某些原因,我仍然没有找到404方法。我现在真的不知道问题出在哪里,因为在我看来一切都很好

我尝试了很多属性、配置等的变化。我最终得到了以下代码:

Global.asax

AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);

GlobalConfiguration.Configure(WebApiConfig.Register);
WebApiConfig.cs

config.MapHttpAttributeRoutes();

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

var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(x => x.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
高级控制器

public class ContactFormController : ApiController
{
    [Route("~/api/sendemail")]
    [HttpPost()]
    public IHttpActionResult SendEmail(ContactFormModel contactForm)
    {
        return Ok();
    }
}
型号:

public class ContactFormModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Subject { get; set; }
    public string Message { get; set; }
}
jQuery代码

var jsonData = { "Name": name.val(), "Email": email.val(), "Subject": subject.val(), "Message": comment.val() };

$.ajax({
    url: "api/sendemail",
    type: "POST",
    data: jsonData,
    cache: false,

    ...
});
正如您所看到的,它是MVC5+WebAPI2


谢谢你的帮助。这么简单的事情,什么都不起作用。

请更新您的global.asax,如下所示:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);

}

并将
[Route(“~/api/sendmail”)]
更改为
[Route(“/api/sendmail”)]

对于我来说,路由属性不适用于WebAPI,因为我的web.config中安装了URL重写模块。不知何故,全局路由模板可以在适当的位置使用它,但不能在每个web方法上面使用路由属性。我从web.config中的
部分中删除了
部分,路由属性开始工作。

在我的例子中,我有一个web API 2项目,该项目发布在域名的子文件夹中,它承载着自己的ASP.net项目。该主应用程序的web.config被继承到web API 2项目的web.config中,这会干扰路由。为了解决我在主项目中遇到的问题

  <location path="." inheritInChildApplications="false"> 
    <system.web> 
    … 
    </system.web> 
  </location>

Api路由必须首先评估,否则您需要创建更严格的mvc路由(这样框架就不会试图寻找“ApiController”)。这不是特定于MVC5的行为。您太棒了!!!它可以工作,只是我必须从建议的路由[route(“/api/sendemail”)]中删除起始/结束。我接受这个答案。从一个空项目开始,我缺少FilterConfig和RouteConfig部分。在模板的基础上添加这些类就成功了。我想补充一点,我在404问题上损失了半个上午,所有的答案似乎对我都不起作用,因为我有所有需要的组件。在我的例子中,我在webapi路由之前注册了正常路由,这似乎超过了api路由,无法识别它们,因此在切换这两个路由之后,它最终起作用了。路由显然不能以
/
开头。我在全局尝试绑定时出错。不知道到底发生了什么,但整个上午都在试图解决这个问题