2016-09-26 5 views
1

現在、私は単体テストで使用しようとしている自己ホスト型Web APIを使用しています。自己のASP.NET Web APIをホストしているときに404が見つかりません。IIS内で問題なく動作します。

どの経路を試しても、404エラーが見つかりません。問題は、IIS内で全く同じWeb APIをホストするとすべて正常に動作することです。私はそれが私のテスト設定で単純な誤植/間違いだと思っていますが、私はそれが動作するようにすることはできません、任意の助けに感謝。ここで

は、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)); 
} 

ここで私は私のユニットテストのために使用してい非稼働設定です:

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私はその部分を省略しませんでしたが、あなたのコメントの後、自分の 'webApiUrl'変数(自己ホストサービスのベースURLとして使用される)を二重チェックしました。私は今、別の "このルートデータが見つかりませんでした"というメッセージが表示されます。エラー、少なくともサービスは404に応答していません。 – ken2k

+0

これは機能しています!基本的に、自己ホスト型サービスに提供されるベースURLは間違っていました。私はそれを理解するのに時間を費やしすぎた。これを回答として追加したいかもしれません@MartinBrandlので、私はあなたに助けの名誉を与えることができます – ken2k

答えて

1

自己ホスティングアプリケーションに仮想ディレクトリ(IISなど)が含まれているかどうかを確認する必要があります。あなたが言及したように、基本パスが有効であることを確認してください。

関連する問題