【问题标题】:Using structureMap sample package in web application在 Web 应用程序中使用 structureMap 示例包
【发布时间】:2018-06-28 02:57:14
【问题描述】:

我在我的应用程序中同时使用 MVC 和 WebApi。为了实现 IoC,我使用结构图示例包(StructureMap.WebApi2)

在 MVC 控制器中一切正常,但是当我使用 web api 时,例如向服务器发布一些内容时,我收到此错误:

[HttpException]: The controller for path '/api/Activity/AddActivity' was not found or does not implement IController.
   at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
   at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
   at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

这是 AddActivity 操作:

[HttpPost]
[ActionName("AddActivity")]
public HttpResponseMessage AddActivity(ActivityDTO activityDTO)
  {
      ActivityDTO data = activityDTO;
      HttpResponseMessage response = new HttpResponseMessage();

      data.UserID = User.Identity.GetUserId();

      int id = _activityServices.Add(data);

      if (id != -1)
      {
         response = this.Request.CreateResponse(HttpStatusCode.OK, id);
      }
      else
      {
         response=this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Activity doesn't save.");
      }

       return response;
  }

我检查了动作的路径,它是正确的。

你能帮帮我吗?

谢谢

更新 1:

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

        var container = IoCFactory.Container;

        GlobalConfiguration.Configuration.Services.Replace(
            typeof(IHttpControllerActivator), new IoCWebApiControllerFactory(container));

        config.MapHttpAttributeRoutes();

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

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

AjaxRequest:

$.post("/api/Activity/AddActivity", data)

【问题讨论】:

标签: c# asp.net-mvc asp.net-web-api inversion-of-control structuremap


【解决方案1】:

您的问题不是依赖注入。在构造函数上放置一个断点并检查注入的依赖项是否不为空。如果这些不为空,则您的设置是正确的。

您有路由问题。当你使用[ActionName("AddActivity")] 时,你应该有一个这样定义的路由:

routes.MapHttpRoute(
   name: "ActionApi",
   routeTemplate: "api/{controller}/{action}/{id}",
   defaults: new { id = RouteParameter.Optional } );

web-api 的默认routeTemplate 没有{action} 部分。你也不应该在这里使用ActionName,因为it has a different purpose。将其替换为Route 属性以使用attribute routing 功能。 More info

【讨论】:

  • 我将 [ActionName("AddActivity")] 更改为 [Route("AddActivity")] 但我在 GetControllerInstance 方法...它说 Page not found: /api/Activity/AddActivity...我更改了请求路径、路由属性和 web api 配置模板,但什么也没发生,我再次出现该错误。我将 ajax 请求代码置于问题中。
  • 当您使用属性路由时,您的“/api”将不再被使用。从这里开始学习属性路由dotnettips.info/post/1660
  • 谢谢...我是 MVC 的初学者,这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 2010-10-21
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多