簡體   English   中英

連接到WebAPI2端點(路由)為控制器拋出Http代碼503,另一個控制器工作正常

[英]Connecting to WebAPI2 endpoints(routes) throw Http code 503 for a controller and another controller works fine

我正在使用Owin自托管WebAPI2。 我有兩個控制器類並使用屬性路由。 其中一人簽名如下:

    [RoutePrefix("api/v1/devices")]
    public class DeviceController : ApiController
    {

        [HttpPost]
        [Route("")]
        public async Task<HttpResponseMessage> DevicePresence()
        {
           ...
        }

        [HttpGet]
        [Route("updates/{deviceID}")]
        public HttpResponseMessage GetDeviceUpdates(string deviceID)
        {
            ...
        }
    }

這個工作正常,動作方法被觸發。

另一個控制器具有以下簽名:

    [RoutePrefix("device/class")]
    public class RemoteController : ApiController
    {
        [HttpGet]
        [Route("remotehost")]
        public HttpResponseMessage RemoteHost()
        {
            ...
        }

        [HttpGet]
        [Route("version")]
        public HttpResponseMessage GetVersion()
        {
            ...
        }
     }

當我嘗試連接到其中任何一個時,我得到503(服務不可用)響應。

我的Startup類初始化如下:

    public class Startup
    {
        public static void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            config.Formatters.Add(new JsonMediaTypeFormatter());
            config.Formatters.Remove(config.Formatters.XmlFormatter);
            config.EnsureInitialized();

            app.UseWebApi(config);
        }
    }

我試圖使用傳統的路由,但仍然是同樣的問題。

config.Routes.MapHttpRoute(
                name: "RemoteApi",
                routeTemplate: "device/{controller}/{action}"
            );

public class ClassController : ApiController
{
       public HttpResponseMessage GetVersion()
        {
            ...
        }
}

這也是投擲503狀態代碼如果我在第二個控制器中更改路由前綴如下,那么它正在工作:

[RoutePrefix("api/v1/device/class")]
    public class RemoteController : ApiController
    {
      ...
    }

根據我的要求,我無法更改端點。

我不確定這里有什么問題,我們非常感謝任何幫助。

您的RemoteController會拋出異常,因為您不遵循WEB API的命名約定。 你的RemoteHost()方法是一個get方法必須有一個“Get”前綴,所以它的名字實際上應該是GetRemoteHost() 那應該解決它。

如果要更改命名約定,可以在global.asax文件中修改路由定義:

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

希望有所幫助。

我意識到這不是webapi或路由的問題。 實際上,我正在為URL添加防火牆例外,並且不知何故它沒有從防火牆設置中刪除並在DACL中保留一個條目。 我從cmd提示符中刪除了它,現在一切正常。

抱歉打擾...

暫無
暫無

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

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