gpt4 book ai didi

c# - 尝试创建 Controller 时发生错误,请确保 Controller 具有无参数公共(public)构造函数

转载 作者:行者123 更新时间:2023-12-03 01:53:34 25 4
gpt4 key购买 nike

在 Controller 上调用特定方法时,我收到以下不一致的错误:

An error occurred when trying to create a controller of type 'TimelineController'. Make sure that the controller has a parameterless public constructor.

令人困惑的部分是这个方法偶尔会起作用,并且 Controller 本身确实有一个无参数构造函数。这是代码的简短示例:

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

正如你所看到的,我没有使用任何形式的依赖注入(inject)(因为这是一个小型的非必要的 Web 应用程序),而且我在研究时看到的几乎所有解决方案都涉及 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)"}}}}}

任何人都可以指导我解决问题吗?

最佳答案

Can anyone guide me on what the issue is?

当然

An error occurred when trying to create a controller of type 'TimelineController'.

这是实际的错误。 ControllerFactory 无法创建 Controller 。

Make sure that the controller has a parameterless public constructor.

这只是一条有用的消息,因为大多数情况下,对于非依赖注入(inject) Controller 来说,这就是问题所在。

构造函数创建了 4 个对象(看起来是使用依赖注入(inject)的好例子)。

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

您只需将它们全部注释掉,它应该“可以”创建 Controller 。显然,方法调用会中断,但这将证明其中之一就是问题所在。如果我猜的话,我会说 TimelineEventRepository() 是罪魁祸首。哪个人导致了问题,您应该能够在 Visual Studio 中对其进行调试。

关于c# - 尝试创建 Controller 时发生错误,请确保 Controller 具有无参数公共(public)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30328767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com