2016-09-26 4 views
1

현재 단위 테스트 내에서 사용하려고하는 자체 호스팅 웹 API가 있습니다.자체 웹 호스팅 ASP.NET 웹 API를 찾을 때 404 찾을 수 없습니다. IIS 내에서 올바르게 작동합니다.

내가 시도하는 경로가 무엇이든간에 404 오류를 찾을 수 없습니다. 문제는 IIS에서 동일한 웹 API를 호스팅 할 때 모든 것이 정상적으로 작동한다는 것입니다. 나는 그것이 내 구성 설정에서 간단한 오타/실수라고 추측하고 있지만 작동하도록 만들 수는 없다.

:

public class WebApiApplication : System.Web.HttpApplication 
{ 
    /// <summary> 
    /// Entry point of the application. 
    /// </summary> 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    } 
} 

public static void Register(HttpConfiguration config) 
{ 
    // IoC configuration 
    var container = new UnityContainer(); 
    UnityContainerConfigurator.Configure(container, new PerRequestLifetimeManager()); 

    // Set the dep resolver 
    config.DependencyResolver = new UnityDependencyResolver(container); 

    // Web API routes 
    config.MapHttpAttributeRoutes(); 

    // Only supports JSON formatter 
    config.Formatters.Clear(); 
    config.Formatters.Add(new JsonMediaTypeFormatter()); 
    config.Formatters.JsonFormatter.SerializerSettings = CustomJsonSerializerSettings.Create(); 

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

    // Custom filter 
    var providers = config.Services.GetFilterProviders().ToList(); 
    var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider); 
    config.Services.Remove(typeof(IFilterProvider), defaultprovider); 
    config.Services.Add(typeof(IFilterProvider), new UnityFilterProvider(container)); 
} 
여기

비 작업 설정 내 단위 테스트를 위해 사용하고있다 : 여기

는 IIS 내에서 호스팅 할 때 나는 내 웹 API에 사용되는 완벽하게 작동 설정입니다
var config = new HttpSelfHostConfiguration(webApiURL); 

#if DEBUG 
    // For debug purposes 
    config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
#endif 

// Web API routes 
config.MapHttpAttributeRoutes(); 

// Only supports JSON formatter 
config.Formatters.Clear(); 
config.Formatters.Add(new JsonMediaTypeFormatter()); 
config.Formatters.JsonFormatter.SerializerSettings = CustomJsonSerializerSettings.Create(); 

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

// Custom filter 
var providers = config.Services.GetFilterProviders().ToList(); 
var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider); 
config.Services.Remove(typeof(System.Web.Http.Filters.IFilterProvider), defaultprovider); 
config.Services.Add(typeof(System.Web.Http.Filters.IFilterProvider), new UnityFilterProvider(this.UnityContainer)); 

// Overwrites the IoC configuration 
config.DependencyResolver = new UnityDependencyResolver(this.UnityContainer); 

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

this.webApiServer = new HttpSelfHostServer(config); 
this.webApiServer.OpenAsync().Wait(); 
enter code here 

나는 또한 새로운 Owin 호스팅 서비스, 동일한 결과를 시도 :

public class Startup 
{ 
    private static IUnityContainer container; 

    /// <summary> 
    /// Overwrites the IoC configuration. 
    /// </summary> 
    /// <param name="container">The container.</param> 
    public static void ConfigureIoC(IUnityContainer container) 
    { 
     Startup.container = container; 
    } 

    /// <summary> 
    /// This code configures Web API. The Startup class is specified as a type 
    /// parameter in the WebApp.Start method. 
    /// </summary> 
    /// <param name="appBuilder">The application builder.</param> 
    public void Configuration(IAppBuilder appBuilder) 
    { 
     if (Startup.container == null) 
     { 
      throw new Exception("Call ConfigureIoC first"); 
     } 

     // Configure Web API for self-host. 
     HttpConfiguration config = new HttpConfiguration(); 
     config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{action}/{id}", 
       defaults: new { id = RouteParameter.Optional }); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     // Only supports JSON formatter 
     config.Formatters.Clear(); 
     config.Formatters.Add(new JsonMediaTypeFormatter()); 
     config.Formatters.JsonFormatter.SerializerSettings = CustomJsonSerializerSettings.Create(); 

     // Custom filter 
     var providers = config.Services.GetFilterProviders().ToList(); 
     var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider); 
     config.Services.Remove(typeof(System.Web.Http.Filters.IFilterProvider), defaultprovider); 
     config.Services.Add(typeof(System.Web.Http.Filters.IFilterProvider), new UnityFilterProvider(container)); 

     // Overwrites the IoC configuration 
     config.DependencyResolver = new UnityDependencyResolver(Startup.container); 

     appBuilder.UseWebApi(config); 
    } 
} 

Postman에서 시작한 것과 동일한 REST 요청은 IIS 내에서 호스팅 될 때 성공하고 자체 테스트에서는 자체 호스팅 서비스로 호스팅 될 때 404입니다.

힌트가 있습니까?

+0

IIS URL에 VirtualDirectory가 포함되어 있습니다. 자체 호스팅 응용 프로그램에서 생략 한 적이 있습니까? –

+0

@MartinBrandl 나는 그 부분을 생략하지 않았지만 귀하의 의견을 다음 (자기 호스팅 된 서비스에 대한 기본 URL로 사용되는) 내 'webApiUrl' 변수를 두 번 확인, 나는 값이 잘못되었다는 것을 발견 ... 어떻게 바보 나 ... 이제 다른 "이 요청에 대한 경로 데이터가 없습니다."라는 메시지가 표시됩니다. 오류, 적어도 서비스가 더 이상 404 응답하지 않습니다. – ken2k

+0

잘 되었어! 기본적으로 자체 호스팅 서비스에 제공된 기본 URL이 잘못되었습니다. 나는 그걸 알아 내는데 너무 많은 시간을 허비했다. 이 답변을 @MartinBrandl로 추가하여 도움을받을 수 있습니다. – ken2k

답변

1

자체 호스팅 응용 프로그램에 IIS와 같은 가상 디렉터리가 있는지 확인해야합니다. 그리고 언급 한대로 기본 경로가 유효한지 확인하십시오.

관련 문제