2015-05-19 64 views
1

我不一致的基础上,叫我控制器上的具体方法时,提示以下错误:错误试图创建一个控制器时,请确保该控制器具有一个无参数的公共构造

错误尝试创建类型为'TimelineController'的控制器时发生。确保控制器有一个无参数的公共构造函数。

令人困惑的部分是,此方法偶尔会工作,并且控制器本身具有无参数构造函数。下面的代码的一个简单的例子:

[Authorize] 
[RoutePrefix("api/timeline")] 
public class TimelineController : CherishApiController 
{ 
    private readonly TimelineEventRepository _timelineEventRepository; 
    private readonly BlobHelper _blobHelper; 
    private readonly ChildHelper _childHelper; 
    private readonly AccountHelper _accountHelper; 

    public TimelineController() 
    { 
     _timelineEventRepository = new TimelineEventRepository(); 
     _blobHelper = new BlobHelper(); 
     _childHelper = new ChildHelper(); 
     _accountHelper = new AccountHelper(); 
    } 

    [HttpPost] 
    [Route("UploadImage")] 
    [ResponseType(typeof(UploadMediaResponse))] 
    public async Task<HttpResponseMessage> UploadImage() 
    { 
     try 
     { 
      return await Upload(Request.Content, MediaType.Image); 
     } 
     catch (Exception ex) 
     { 
      return ErrorResponse(ex); 
     } 
    } 

    private async Task<HttpResponseMessage> Upload(HttpContent requestContent, string mediaType) 
    { 
     // reads the data from the multi-part request and stores a record in an Azure DocumentDB 
    } 
} 

如你我没有使用任何形式的依赖注入的看到(因为这是小非必要的网络应用程序)和几乎所有的解决方案,我在研究涉及DI设置问题时已经看到了。

以下是完整的堆栈跟踪,如果有帮助:

An error occurred when trying to create a controller of type 'TimelineController'. Make sure that the controller has a parameterless public constructor.","ExceptionType":"System.InvalidOperationException","StackTrace":" 
    at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n 
    at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n 
    at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"One or more errors occurred.","ExceptionType":"System.AggregateException","StackTrace":" 
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n 
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)\r\n 
    at System.Threading.Tasks.Task`1.get_Result()\r\n 
    at Microsoft.Azure.Documents.Linq.DocumentQuery`1.GetEnumerator()\r\n 
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source)\r\n 
    at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)\r\n 
    at Cherish.Domain.Repositories.Implementation.DocumentRepository`1.ReadOrCreateDatabase()\r\n 
    at Cherish.Domain.Repositories.Implementation.DocumentRepository`1..ctor()\r\n 
    at lambda_method(Closure)\r\n 
    at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"An error occurred while sending the request.","ExceptionType":"System.Net.Http.HttpRequestException","StackTrace":" 
    at Microsoft.Azure.Documents.BackoffRetryUtility`1.<ExecuteAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 
    at Microsoft.Azure.Documents.Linq.DocumentQueryExecutionContext.<ExecuteAllAsync>d__7.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 
    at Microsoft.Azure.Documents.Linq.DocumentQuery`1.<GetEnumeratorTAsync>d__10.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"Unable to connect to the remote server","ExceptionType":"System.Net.WebException","StackTrace":" 
    at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)\r\n 
    at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"An attempt was made to access a socket in a way forbidden by its access permissions","ExceptionType":"System.Net.Sockets.SocketException","StackTrace":" 
    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)\r\n 
    at System.Net.Sockets.Socket.InternalBind(EndPoint localEP)\r\n 
    at System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state)\r\n 
    at System.Net.Sockets.Socket.UnsafeBeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)\r\n 
    at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)"}}}}} 

任何人都可以指导我的问题是什么?

回答

2

任何人都可以指导我什么问题是?

当然

试图创建类型的控制装置 'TimelineController' 时发生错误。

这是实际的错误。 ControllerFactory无法创建控制器。

确保控制器具有一个无参数的公共构造函数。

这只是一个有用的消息,因为大多数情况下非依赖注入的控制器都是这个问题。

您的构造函数创建4个对象(看起来像一个很好的例子使用依赖注入)。

_timelineEventRepository = new TimelineEventRepository(); 
_blobHelper = new BlobHelper(); 
_childHelper = new ChildHelper(); 
_accountHelper = new AccountHelper(); 

你可以简单地评论他们全部,它应该“工作”创建控制器。明显的方法调用会中断,但这将证明其中一个问题。如果我猜测,我会说TimelineEventRepository()是小数。哪一个人导致了这个问题,你应该可以在Visual Studio中进行调试。

+0

感谢您的提示。我从构造函数中注释了这些行,并向库中添加了'IDisposable'实现,以便我可以将每个用法都包含在'using()'中。不幸的是,我仍然遇到同样的问题。 –

相关问题