首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebAPI在服务器上提供404

WebAPI在服务器上提供404
EN

Stack Overflow用户
提问于 2016-04-05 21:20:05
回答 2查看 844关注 0票数 1

这个问题已经问过无数次了,但是.

我有一个WebAPI。它在运行IIS的本地计算机上工作。但是在部署到服务器之后,它就失败了。

我尝试过的事情:

已添加

代码语言:javascript
复制
<modules runAllManagedModulesForAllRequests="true">

将处理程序设置为

代码语言:javascript
复制
<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" />

添加json作为MIME类型

代码语言:javascript
复制
<staticContent>
  <mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent>

路由映射为

代码语言:javascript
复制
// Web API routes
        config.MapHttpAttributeRoutes();

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

启动文件:

代码语言:javascript
复制
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);
    }

更新

以下是我的完整WebApiConfig:

代码语言:javascript
复制
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

下面是我如何在Autofac上注册我的控制器

代码语言:javascript
复制
private static void RegistererWebApi(ContainerBuilder builder, HttpConfiguration config)
    {
        // Register your Web API controllers.
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());            
    }

这是我的控制器:

代码语言:javascript
复制
[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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-04-06 01:43:43

看来你在使用OWIN,而不是老式的单例GlobalConfiguration.然而,您正在GlobalConfiguration上设置依赖解析器。

依赖解析器

尝试设置config.DependencyResolver例如,检查文档/解释。

票数 1
EN

Stack Overflow用户

发布于 2016-04-06 23:08:54

这是一个配置设置。在服务器(它是一个较旧的服务器)上,尽管仍在运行IIS7,但您需要显式地告诉IIS查找一个OWIN类:

代码语言:javascript
复制
<appSettings>  
  <add key="owin:appStartup"          vaue="yourproject.startup" />       
</appSettings>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36437263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档