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입니다.
힌트가 있습니까?
IIS URL에 VirtualDirectory가 포함되어 있습니다. 자체 호스팅 응용 프로그램에서 생략 한 적이 있습니까? –
@MartinBrandl 나는 그 부분을 생략하지 않았지만 귀하의 의견을 다음 (자기 호스팅 된 서비스에 대한 기본 URL로 사용되는) 내 'webApiUrl' 변수를 두 번 확인, 나는 값이 잘못되었다는 것을 발견 ... 어떻게 바보 나 ... 이제 다른 "이 요청에 대한 경로 데이터가 없습니다."라는 메시지가 표시됩니다. 오류, 적어도 서비스가 더 이상 404 응답하지 않습니다. – ken2k
잘 되었어! 기본적으로 자체 호스팅 서비스에 제공된 기본 URL이 잘못되었습니다. 나는 그걸 알아 내는데 너무 많은 시간을 허비했다. 이 답변을 @MartinBrandl로 추가하여 도움을받을 수 있습니다. – ken2k