[英]WebAPI giving 404 on server
这已经被问了一百万次,但是......
我有一个 WebAPI。 它适用于我运行 IIS 的本地机器。 但是在部署到服务器后,它失败了。
我尝试过的事情:
添加
<modules runAllManagedModulesForAllRequests="true">
将处理程序设置为
<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 类型
<staticContent>
<mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent>
路由被映射为
// 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);
}
更新
这是我的完整 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());
}
这是我的控制器:
[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);
}
}
看来你使用OWIN,而不是老式的单GlobalConfiguration
...但你设置的依赖解析器GlobalConfiguration
。
使用 OWIN 时的常见错误之一是尝试设置GlobalConfiguration
依赖项解析器。
尝试设置config.DependencyResolver
代替。 检查文档以获取示例/说明。
这是一个配置设置。 在较旧的服务器上,虽然仍在运行 IIS7,但您需要明确告诉 IIS 查找 OWIN 启动类:
<appSettings>
<add key="owin:appStartup" vaue="yourproject.startup" />
</appSettings>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.