2016-04-05 13 views
0

Dies wurde eine Million Mal gefragt, aber ....WebAPI geben 404 auf Server

Ich habe eine WebAPI. Es funktioniert auf meinem lokalen Computer, auf dem IIS ausgeführt wird. Aber nach der Bereitstellung auf dem Server schlägt es fehl.

Dinge, die ich habe versucht:

Added

<modules runAllManagedModulesForAllRequests="true"> 

Set-Handler

<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" /> 

hinzufügen json als MIME-Typ

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

Routing wird als

abgebildet
// Web API routes 
     config.MapHttpAttributeRoutes(); 

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

Startup-Datei:

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

Hier ist meine volle 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 } 
     ); 


    } 

UPDATE2

Hier ist, wie ich meine Controller mit Autofac

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

registrieren Und hier ist mein Controller:

[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

Wie definieren Sie die Route? –

+0

In WebApiConfig.Register. Und ich benutze nur Attribut-Routen. –

+0

Auf welcher/wie/Art von API-Aufruf? – EdSF

Antwort

0

Es war eine Konfigurationseinstellung. Auf dem Server, der ein älterer Server ist, obwohl IIS7 weiterhin ausgeführt wird, müssen Sie IIS explizit mitteilen, dass nach einer OWIN-Startup-Klasse gesucht werden soll:

Verwandte Themen