2016-04-05 12 views
0

これは何百万回も尋ねられてきましたが....WebAPI 404 on server

私はWebAPIを持っています。これは、IISを実行しているローカルマシン上で動作します。しかし、サーバーにデプロイした後は失敗します。

私が試してみました物事:

<remove name="WebDAV" /> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

追加

<modules runAllManagedModulesForAllRequests="true"> 

設定ハンドラルーティングが

0としてマッピングされているMIMEタイプとして

<staticContent> 
    <mimeMap fileExtension=".json" mimeType="application/json" /> 
</staticContent> 

をJSONを追加します。

// Web API routes 
     config.MapHttpAttributeRoutes(); 

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

スタートアップファイル:

public static void ConfigureContainer(IAppBuilder app) 
    { 
     var builder = new ContainerBuilder(); 

     var options = CreateCorsOptions(); 
     app.UseCors(options); 

     // Get your HttpConfiguration. 
     config = new HttpConfiguration(); 

     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     WebApiConfig.Register(config); 

     RegistererWebApi(builder, config); 

     // Register dependencies, then... 
     var container = builder.Build(); 
     var webApiResolver = new AutofacWebApiDependencyResolver(container); 
     GlobalConfiguration.Configuration.DependencyResolver = webApiResolver; 

     // Register the Autofac middleware FIRST. This also adds 
     // Autofac-injected middleware registered with the container. 
     app.UseAutofacMiddleware(container); 
     app.UseAutofacWebApi(config); 
     app.UseWebApi(config); 

    } 

private static void RegistererWebApi(ContainerBuilder builder, HttpConfiguration config) 
    { 
     // Register your Web API controllers. 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

     // OPTIONAL: Register the Autofac filter provider. 
     //builder.RegisterWebApiFilterProvider(config); 
    } 

UPDATE

ここでは、私の完全なWebApiConfigです:

public static class WebApiConfig 
{ 
    /// <summary> 
    /// Register the WebAPI. Remove Xml formatter (OPnly using JSON). Add filters. Set Routing 
    /// </summary> 
    /// <param name="config"></param> 
    public static void Register(HttpConfiguration config) 
    { 
     //Enable cross origin requests 
     var cors = new EnableCorsAttribute("http://local.isos.com,htt://dev.isos.mydelphic.com,http://qa.isos.mydelphic.com,http://localhost/", headers: "*", methods: "*"); 
     config.EnableCors(cors); 

     // Web API configuration and services 
     // Remove the XML formatter 
     config.Formatters.Remove(config.Formatters.XmlFormatter); 

     var json = config.Formatters.JsonFormatter; 
     json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     json.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; 

     config.Filters.Add(new UnhandledExceptionFilter()); 

     config.MessageHandlers.Add(new CacheCow.Server.CachingHandler(config)); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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


    } 

アップデート2

ここ

は、私がAutofac

private static void RegistererWebApi(ContainerBuilder builder, HttpConfiguration config) 
    { 
     // Register your Web API controllers. 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly());    
    } 

と私のコントローラを登録する方法であり、ここで私のコントローラである:あなたがOWIN、ない古いスタイルのシングルトンGlobalConfigurationを使用している表示されます

[RoutePrefix("providers")] 
public class ProviderController : BaseApiController 
{ 
    /// <summary> 
    /// Constructor 
    /// </summary> 
    /// <param name="requestDispatcher">Dispatcher gets injected by Ioc</param> 
    public ProviderController(IRequestDispatcher requestDispatcher) 
     : base(requestDispatcher) 
    { } 

    /// <summary> 
    /// Get a list of all providers outside the Philipines 
    /// </summary> 
    /// <returns>Returns an action result regarding the state of the request. Returns a 200 containing the list of providers. Returns a 404 is no results are found.</returns> 
    [Route("",Name="Providers")] 
    public async Task<IHttpActionResult> Get(string sort = "ProviderName", int page = 1, int pageSize = 10) 
    { 
     var query = new GetProviders(); 
     // Populate the view model by calling the appropriate handler 
     var providers = await RequestDispatcher.DispatchAsync<GetProviders, ProvidersResponse>(query); 
     if (providers == null) 
     { 
      return NotFound(); 
     } 

     var totalCount = providers.Count; 
     var totalPages = (int)Math.Ceiling((double)totalCount/pageSize); 

     var urlHelper = new UrlHelper(Request); 

     //Route name 
     var prevLink = page > 1 ? urlHelper.Link("Providers", 
     new 
     { 
      page = page - 1, 
      pageSize = pageSize, 
      sort = sort 
     }) : ""; 

     var nextLink = page < totalPages ? urlHelper.Link("Providers", 
     new 
     { 
      page = page + 1, 
      pageSize = pageSize, 
      sort = sort 
     }) : ""; 


     var paginationHeader = new 
     { 
      currentPage = page, 
      pageSize = pageSize, 
      totalCount = totalCount, 
      totalPages = totalPages, 
      previousPageLink = prevLink, 
      nextPageLink = nextLink 
     }; 

     HttpContext.Current.Response.Headers.Add("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(paginationHeader)); 

     return Ok(providers); 
    } 
} 
+0

どのようにルートを定義していますか? –

+0

WebApiConfig.Registerにあります。そして、私は実際に属性ルートを使用しています。 –

+0

どのAPIコールの/方法/タイプですか? – EdSF

答えて

0

構成設定でした。古いサーバーであるサーバーでは、まだIIS7を実行していますが、IISに明示的にOWINスタートアップクラスを探すように指示する必要があります。

<appSettings> 
    <add key="owin:appStartup"   vaue="yourproject.startup" />  
</appSettings>