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);
}
}
Wie definieren Sie die Route? –
In WebApiConfig.Register. Und ich benutze nur Attribut-Routen. –
Auf welcher/wie/Art von API-Aufruf? – EdSF