简体   繁体   English

在Global.asax.cs中注册类

[英]Registering classes in Global.asax.cs

I have created the classes called HttpNotFoundAwareControllerActionSelector.cs and HttpNotFoundAwareDefaultHttpControllerSelector.cs inside the Controllers liked showed in the article here 我在此处显示的喜欢的控制器中创建了名为HttpNotFoundAwareControllerActionSelector.cs和HttpNotFoundAwareDefaultHttpControllerSelector.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;
    }
}

and

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;
    }
}
}

where ErrorController.cs is 其中ErrorController.cs是

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" });
    }
}

But to register the custom IHttpControllerSelector and IHttpActionSelector in the global.asax.cs 但是要在global.asax.cs中注册自定义IHttpControllerSelector和IHttpActionSelector

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());
    }
}

It throws the below exception 它抛出以下异常 在此处输入图片说明

On the Lines 上线

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

In your global.asax: 在您的global.asax中:

  • Add using System.Web.Http.Dispatcher; using System.Web.Http.Dispatcher;添加using System.Web.Http.Dispatcher;

  • Replace configuration with GlobalConfiguration.Configuration configuration替换为GlobalConfiguration.Configuration

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

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