API 无法识别 ApiController

API does not recognize ApiController

我在访问我的 ApiController 时遇到问题。当我拨打 API 电话时,我收到以下响应:

{
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost/myapp/api/data/abc'.",
    "MessageDetail": "No action was found on the controller 'Data' that matches the request."
}

我想在 TopShelf 服务上创建一个 OWIN 网络 API,我可以从中获取一些数据。 我对此很陌生,所以我希望有人能向我解释我做错了什么。看起来很明显我看不到。

开始:

var apiHostConfiguration = new Dictionary<string, WebApiHostConfig> {{"webApi", new WebApiHostConfig {Endpoint = "/myapp" ,RequiresOAuth = false}}};
// Start OWIN host 

const string baseAddress = "http://localhost";
foreach (var conf in apiHostConfiguration)
{
    var app = new WebApiApp();
    var opt = new StartOptions(baseAddress + conf.Value.Endpoint);
    OwinApps.Add(WebApp.Start(opt, app.Configuration));
}

ApiConfig:

class WebApiApp
{
    public void Configuration(IAppBuilder appBuilder)
    {
        var config = new HttpConfiguration();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/",
            defaults: new {}
        );
        config.Formatters.Clear();
        config.Formatters.Add(new JsonMediaTypeFormatter());
        config.EnableCors();
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
        appBuilder.UseWebApi(config);
    }
}

控制器:

[EnableCors("*", "*", "*")]
public class DataController : ApiController
{
    [HttpGet]
    public string Abc(string text)
    {
        var name = GetType().Name;
        return $"{name} pings back «{text}»";
    }
}

API 通话:

http://localhost/myapp/api/data/abc

替换

localhost

使用分配给您所在系统的私人 IP 运行 您的网络 service/API

i.e http://192.168.8.100

你可以找到你的私有ip

在命令提示符处键入 ipconfig /all:如果您使用的是 windows
在命令提示符下输入 ifconfig:如果你在 mac

问题就像@AluanHaddad 在我的问题下面的评论中说的那样,我没有将 string text 从我的动作定义到路线中。

评论:

Your route template does not include an optional parameter. 
It is also not very restful FWIW. 
Try 
    routeTemplate: "api/{controller}/{action}/{text?}", 
    defaults: new {text = RouteParameter.Optional} 
but consider that 
    routeTemplate: "api/{controller}/{text?}", 
    defaults: new {text = RouteParameter.Optional} 
is likely preferable.

谢谢分配。