簡體   English   中英

WebAPI返回404(未找到)

[英]WebAPI returns 404 (Not Found)

我創建了一個簡單的Web API,以從domain / api / html / footer返回HTML字符串:

public class htmlController : ApiController
{
    // GET api/html
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/html/section
    public string Get(string id)
    {
        if (id == "footer") return "<div>FOO</div>";
        return null;
    }
}

不變的WebApiConfig.cs

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

我將WebAPI添加到一個域的domain / api /文件夾中,該包括一個單獨的項目(在其根文件夾中)。

WebAPI項目是否期望位於根文件夾中? 如果是這樣,我該如何解決它才能在/ api /文件夾中工作? 如果沒有,會發生什么? 當我從Visual Studio運行它時, / api / html/ api / html / footer /都可以正常工作!

編輯:

這可以是某些IIS設置(即,它沒有遇到index.htm / default.aspx / etc頁)嗎? 導航到domain / api / ,盡管存在/ api / dir,但仍未找到。 或許在Web.config ,最有可能是<system.webServer>部分,但是在SO上提供的解決方案(即,將ExtensionlessUrlHandler的路徑更改為*而不是*. ),等等均無效。 在我給出的這個示例中,服務器傳遞了500錯誤。

您必須設置路徑。

使用此代碼,您發布了:

public class htmlController : ApiController
{
    // GET api/html
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/html/section
    public string Get(string id)
    {
        if (id == "footer") return "<div>FOO</div>";
        return null;
    }
}

您具有以下路線:GET: api/html GET: api/html/id

如果要從api/html/footer路由中調用某些方法,則需要對其進行配置。 您可以執行以下操作:

[RoutePrefix("api/html")]
public class htmlController : ApiController
{
    // GET api/html
    [Route("footer")]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/html/section
    [Route("footer/{id}")]
    public string Get(string id)
    {
        if (id == "footer") return "<div>FOO</div>";
        return null;
    }
}

編輯.Net 4

我已經在項目的根目錄下創建了domain/api文件夾,並以與您相同的方式添加了控制器:

public class HtmlController : ApiController
{
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    public string Get(string id)
    {
        if (id == "footer") return "<div>FOO</div>";
        return null;
    }
}

控制器的文件夾

我正在使用.net framework 4

在此處輸入圖片說明

這是我調用api/html/footer時的結果:

結果

您是否創建了WebApiConfig並將其添加到Global.asax

public class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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

public class Global : System.Web.HttpApplication
{

    protected void Application_Start(object sender, EventArgs e)
    {

        WebApiConfig.Register(GlobalConfiguration.Configuration);
    }

    // ... the rest of your global.asax
}

根據您所說的將其添加到domain/api說法,然后根據配置將您的api配置為domain/api/api/html/footer 除非另有配置,否則VS默認情況下會在根上進行調試。

如果不會進行任何普通的MVC調用,則可以安全地將routeTemplate更改為routeTemplate: "{controller}/{id}/"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM