現在、私は単体テストで使用しようとしている自己ホスト型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となります。
ヒント?
IISのURLにVirtualDirectoryが含まれていますが、それをあなたの自己ホスティングアプリケーション用に省略しようとしましたか? –
@MartinBrandl私はその部分を省略しませんでしたが、あなたのコメントの後、自分の 'webApiUrl'変数(自己ホストサービスのベースURLとして使用される)を二重チェックしました。私は今、別の "このルートデータが見つかりませんでした"というメッセージが表示されます。エラー、少なくともサービスは404に応答していません。 – ken2k
これは機能しています!基本的に、自己ホスト型サービスに提供されるベースURLは間違っていました。私はそれを理解するのに時間を費やしすぎた。これを回答として追加したいかもしれません@MartinBrandlので、私はあなたに助けの名誉を与えることができます – ken2k