web-dev-qa-db-ja.com

Web API 2が機能しない(404)

私は長い間、Web API2を機能させることを試みてきました。インターネットでたくさんの記事や投稿を読んだことがありますが、今のところ運が悪かったです。

単純な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);

ApiController

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,

    ...
});

ご覧のとおり、MVC 5 + Web API2です。

手伝ってくれてありがとう。とても単純なことで、何も機能していません。

14
Daniel

ここのようにglobal.asaxを更新してください:

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

}
_

[Route("~/api/sendemail")][Route("/api/sendemail")]に変更します

25
sylwester

私の場合、web.configにURL書き換えモジュールがインストールされていたため、ルーティング属性がWebAPIで機能していませんでした。どういうわけか、グローバルルーティングテンプレートはその場で機能していましたが、各Webメソッドの上のルーティング属性は機能していませんでした。 web.configの<rewrite>セクション内から<system.webServer>セクションを削除すると、ルーティング属性が機能し始めました。

1
DougK

私の場合、独自のASP.netプロジェクトをホストするドメイン名のサブフォルダーで公開されていたWeb API2プロジェクトがありました。そのメインアプリケーションのweb.configは、Web API 2プロジェクトのweb.configに継承されたため、ルーティングが妨げられました。問題を解決するには、メインプロジェクトでI web.configの継承を完全に停止しました

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