2016-11-22 1 views
0

ich die Klassen erstellt haben genannt HttpNotFoundAwareControllerActionSelector.cs und HttpNotFoundAwareDefaultHttpControllerSelector.cs innerhalb der Controller in dem Artikel hereRegistrieren von Klassen in Global.asax.cs

public class HttpNotFoundAwareControllerActionSelector : ApiControllerActionSelector 
{ 
    public HttpNotFoundAwareControllerActionSelector() 
    { 
    } 
    public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext) 
    { 
     HttpActionDescriptor decriptor = null; 
     try 
     { 
      decriptor = base.SelectAction(controllerContext); 
     } 
     catch (HttpResponseException ex) 
     { 
      var code = ex.Response.StatusCode; 
      if (code != HttpStatusCode.NotFound && code != HttpStatusCode.MethodNotAllowed) 
       throw; 
      var routeData = controllerContext.RouteData; 
      routeData.Values["action"] = "Handle404"; 
      IHttpController httpController = new ErrorController(); 
      controllerContext.Controller = httpController; 
      controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, "Error", httpController.GetType()); 
      decriptor = base.SelectAction(controllerContext); 
     } 
     return decriptor; 
    } 
} 

und

public class HttpNotFoundAwareDefaultHttpControllerSelector: DefaultHttpControllerSelector 
{ 
    public HttpNotFoundAwareDefaultHttpControllerSelector(HttpConfiguration configuration): base(configuration) 
    { 
    } 
    public override HttpControllerDescriptor SelectController(HttpRequestMessage request) 
    { 
    HttpControllerDescriptor decriptor = null; 
    try 
     { 
      decriptor = base.SelectController(request); 
     } 
     catch (HttpResponseException ex) 
     { 
     var code = ex.Response.StatusCode; 
     if (code != HttpStatusCode.NotFound) 
      throw; 
     var routeValues = request.GetRouteData().Values; 
     routeValues["controller"] = "Error"; 
     routeValues["action"] = "Handle404"; 
     decriptor = base.SelectController(request); 
     } 
     return decriptor; 
    } 
} 
} 
mochte zeigte

wo Errorcontroller .cs ist

public class ErrorController : ApiController 
{ 
    [HttpGet, HttpPost, HttpPut, HttpDelete, HttpHead, HttpOptions, AcceptVerbs("PATCH")] 
    public HttpResponseMessage Handle404() 
    { 
     var responseMessage = new HttpResponseMessage(HttpStatusCode.NotFound); 
     responseMessage.ReasonPhrase = "The requested resource is not found"; 
     return Request.CreateResponse(new { error = "The requested resource is not found" }); 
    } 
} 

Aber die benutzerdefinierte IHttpControllerSelector und IHttpActionSelector in dem global.asax.cs

public class WebApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 
     configuration.Services.Replace(typeof(IHttpControllerSelector), new HttpNotFoundAwareDefaultHttpControllerSelector(configuration)); 
     configuration.Services.Replace(typeof(IHttpActionSelector), new HttpNotFoundAwareControllerActionSelector()); 
    } 
} 

Es führt die unten Ausnahme enter image description here

auf den Linien

configuration.Services.Replace(typeof(IHttpControllerSelector), new HttpNotFoundAwareDefaultHttpControllerSelector(configuration)); 
    configuration.Services.Replace(typeof(IHttpActionSelector), new HttpNotFoundAwareControllerActionSelector()); 

Antwort

1

In Ihrem global.asax registrieren:

  • Hinzufügen using System.Web.Http.Dispatcher;

  • ersetzen configuration mit GlobalConfiguration.Configuration

Verwandte Themen