简体   繁体   English

WebAPI 在服务器上给出 404

[英]WebAPI giving 404 on server

This has been asked a million times but....这已经被问了一百万次,但是......

I have a WebAPI.我有一个 WebAPI。 It works on my local machine running IIS.它适用于我运行 IIS 的本地机器。 But after deploying to server, it fails.但是在部署到服务器后,它失败了。

Things I have tried:我尝试过的事情:

Added添加

<modules runAllManagedModulesForAllRequests="true">

Set handlers to将处理程序设置为

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

Add json as MIME type添加 json 作为 MIME 类型

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

Routing is mapped as路由被映射为

// Web API routes
        config.MapHttpAttributeRoutes();

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

Startup file:启动文件:

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更新

Here is my full WebApiConfig:这是我的完整 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更新2

Here is how I register my controllers with Autofac这是我向 Autofac 注册我的控制器的方法

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

And here is my 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);
    }
}

It appears you're using OWIN, not the older-style singleton GlobalConfiguration ... yet you're setting the dependency resolver on GlobalConfiguration .看来你使用OWIN,而不是老式的单GlobalConfiguration ...但你设置的依赖解析器GlobalConfiguration

One of the common errors when using OWIN is to try to set the GlobalConfiguration dependency resolver. 使用 OWIN 时的常见错误之一是尝试设置GlobalConfiguration依赖项解析器。

Try setting config.DependencyResolver instead.尝试设置config.DependencyResolver代替。 Check the docs for example/explanation. 检查文档以获取示例/说明。

It was a configuration setting.这是一个配置设置。 On the server, which is an older server, although still running IIS7, you need to explicitly tell IIS to look for an OWIN start up class:在较旧的服务器上,虽然仍在运行 IIS7,但您需要明确告诉 IIS 查找 OWIN 启动类:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM