2015-05-05 4 views
3

У меня есть asp.net web api с Unity как мой зависимый преобразователь и OWIN для аутентификации OAuth.ASP.NET WebApi не работает. Все маршруты возвращаются 404

я создаю Startup.cs с помощью Visual Studio "Add New Item" -MENU, выбирая Owin Startup класс:

[assembly: OwinStartup(typeof(MyNameSpace.Startup))] 
namespace MyNameSpace 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      var config = new HttpConfiguration(); 
      WebApiConfig.Register(config); 
      config.DependencyResolver = new UnityHierarchicalDependencyResolver(UnityConfig.GetConfiguredContainer()); 
      app.UseWebApi(config); 
     } 
    } 
} 

Мои WebApiConfig.cs выглядит следующим образом:

public static void Register(HttpConfiguration config) 
{ 
    // Web API configuration and services 
    config.SuppressDefaultHostAuthentication(); 
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

    // Web API routes 
    config.MapHttpAttributeRoutes(); 

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

Теперь, когда Я запускаю приложение, я получаю ответ Forbidden для URL-адреса по умолчанию, который равен http://localhost:port/. Веб-api размещен по адресу http://localhost:port/api/. Когда я делаю запрос на этот url или любой контроллер в приложении, он отвечает Не найдено.

Кроме того, когда я поставил точку останова в методе Configuration класса Startup; когда я запустить приложение отображает следующую (я не знаю, если это уместно):

message

Я не могу понять, что случилось. Он работал прошлой ночью, и я единственный, кто работал над этим проектом. Единственное, что я сделал, это добавить OData ссылки от NuGet, но я удалил их снова, как только установил, что api не работал.

EDIT:

Я хотел бы добавить, что любой точка останова я поставил в приложении в данный момент отображается тем же сообщение, когда я зависать над ним, так что, возможно, этим отношением в конце концов.

EDIT 2:

Это отрывок из EmployeeController.cs:

[Authorize] 
public class EmployeeController : ApiController 
{ 
    private readonly IEmployeeService _service; 

    public EmployeeController(IEmployeeService employeeService) 
    { 
     _service = employeeService; 
    } 

    [HttpGet] 
    [ResponseType(typeof(Employee))] 
    public IHttpActionResult GetEmployee(string employeeId) 
    { 
     var result = _service.GetEmployees().FirstOrDefault(x => x.Id.Equals(employeeId)); 
     if (result != null) 
     { 
      return Ok(result); 
     } 
     return NotFound(); 
    } 

    [HttpGet] 
    [ResponseType(typeof (IQueryable<Employee>))] 
    public IHttpActionResult GetEmployees() 
    { 
     return Ok(_service.GetEmployees()); 
    } 
... 

EDIT 3

После перезапуска Visual Studio, как предложил я могу подтвердить, что предупреждение точка останова сохраняется и отображается по всей заявке:

breakpoint in controller

EDIT 4

OWIN Удаление ссылок и Startup.cs, приложение теперь отскакивает назад в жизнь. Я могу снова разместить точки останова и совершать вызовы api. Что происходит?

+0

Вы можете показать одно из ваших действий с API? –

+0

Я отредактировал мой вопрос, чтобы включить код с контроллера. –

+0

Эта проблема с точкой останова обычно разрешается при перезапуске Visual Studio. –

ответ

1

Методы действий WebAPI основаны на HTTP-глаголе.

Если вы хотите назвать метод действия, отличный от HTTP-глагола, вы хотите посмотреть на Attribute Routing.

В вашем примере вы используете простой HTTP-глагол. Если это так, вам просто нужно Получить.

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

    // GET api/employee/5 
    public string Get(int id) 
    { 
     return "value"; 
    } 
} 
+0

Я не думаю, что маршрут - «сопоставление» отключен. Он работал прошлой ночью. Но я прокомментировал свою логику контроллера и заменил ее на ваш, и это результат: [первый] (http://i.imgur.com/Q4yltnj.png), [второй] (http: //i.imgur. com/7YNWro8.png) –

+0

В настоящее время у вас слишком много ошибок. Вам нужно отследить его. Работает ли ваш код без OWIN? Кроме того, щелкните правой кнопкой мыши по решению и выберите «Чистое решение», чтобы убедиться. – Win

+0

Вы были правы в действиях в том виде, в котором я их разместил. Я удалил некоторую маршрутизацию атрибутов, прежде чем отправлять код контроллера. Однако даже при этом веб-api должен отвечать сообщением об исключении, которого нет. Он по-прежнему отвечает только «404». Я удалил OWIN, и приложение теперь работает. Поэтому ошибка должна заключаться в том, как я реализовал поддержку OWIN. –

0

Только точка о контрольных точках, не связанных, у меня была эта проблема. Понял, что после того, как я опубликовал приложение на веб-сервере, VS2013 фактически обновил мой web.config в соответствии с моим преобразованием web.config, которое у меня было для публикации, и отключил отладку (согласно моему преобразованию). Возможно, я являюсь новичком, и это правильное поведение, но это не было желаемое поведение! :) Это сообщение старое, я знаю, но если это помогает кому-либо с теми же симптомами, отлично.