我正在尝试使用/ template / {contentId}的URI模板声明处理OpenRasta中的多部分文档的POST,但它失败了。配置是
ResourceSpace.Has.ResourcesOfType<Content>().AtUri("/content/{contentId}").HandledBy<ContentHandler>().RenderedByAspx("~/Views/ContentView.aspx").And.AsJsonDataContract();
处理程序方法如下:
public OperationResult Post(string contentId, IEnumerable<IMultipartHttpEntity> entities) {...}
我正在使用以下curl命令来测试
./curl -v -F myPartName=@./hello.txt http://localhost:10247/content/id-1
如果我从URI模板中删除“{contentId}”并相应地修改处理程序,POST工作正常。
有关如何解决的任何想法?日志文件如下。谢谢 - 罗兰岛
4-[2011-10-10 02:27:47Z] Verbose(0) Starts pre-executing the request.
4-[2011-10-10 02:27:47Z] Verbose(0) Incoming host request for http://localhost:10247/content/id-1
4-[2011-10-10 02:27:47Z] Verbose(0) Adding communication context data
4-[2011-10-10 02:27:47Z] Warning(0) Contributor call for BootstrapperContributor had a null Action.
4-[2011-10-10 02:27:47Z] Start(1) Entering PipelineRunner: Executing contributor HttpMethodOverriderContributor.OverrideHttpVerb
4-[2011-10-10 02:27:47Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:47Z] Start(1) Entering PipelineRunner: Executing contributor AuthenticationContributor.AuthoriseRequest
4-[2011-10-10 02:27:47Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:47Z] Start(1) Entering PipelineRunner: Executing contributor UriDecoratorsContributor.ProcessDecorators
4-[2011-10-10 02:27:47Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:47Z] Start(1) Entering PipelineRunner: Executing contributor ResourceTypeResolverContributor.ResolveResource
4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:51Z] Verbose(0) Rewrote path.
4-[2011-10-10 02:27:51Z] Start(1) Entering OpenRastaRewriterHandler: Rewriting to original path
4-[2011-10-10 02:27:51Z] Start(1) Entering OpenRastaIntegratedHandler: Request for http://localhost:10247/content/id-1
4-[2011-10-10 02:27:51Z] Verbose(0) Incoming host request for http://localhost:10247/content/id-1
4-[2011-10-10 02:27:51Z] Verbose(0) Adding communication context data
4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor HandlerResolverContributor.ResolveHandler
4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationCreatorContributor.CreateOperations
4-[2011-10-10 02:27:51Z] Verbose(0) Created operation named Get with signature ContentHandler::Get(String contentId)
4-[2011-10-10 02:27:51Z] Verbose(0) Created operation named Post with signature ContentHandler::Post(String contentId, IEnumerable`1 entities)
4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationFilterContributor.ProcessOperations
4-[2011-10-10 02:27:51Z] Verbose(0) Found 1 operation(s) with a matching name.
4-[2011-10-10 02:27:51Z] Verbose(0) Found 0 operation(s) with matching [HttpOperation] attribute.
4-[2011-10-10 02:27:51Z] Verbose(0) No resource or no uri name. Not filtering.
4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationCodecSelectorContributor.ProcessOperations
4-[2011-10-10 02:27:51Z] Information(0) Operation ContentHandler::Post(String contentId, IEnumerable`1 entities) selected with 2 required members and 0 optional members, with codec MultipartFormDataKeyedValuesCodec with score 1.5.
4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationHydratorContributor.ProcessOperations
4-[2011-10-10 02:27:51Z] Information(0) Operation ContentHandler::Post(String contentId, IEnumerable`1 entities) was selected with a codec score of 1.5
4-[2011-10-10 02:27:51Z] Information(0) Loaded codec OpenRasta.Codecs.MultipartFormDataKeyedValuesCodec
4-[2011-10-10 02:27:51Z] Information(0) Codec supports IKeyedValuesMediaTypeReader. Processing parameters.
4-[2011-10-10 02:27:51Z] Verbose(0) Seeking to next available part
4-[2011-10-10 02:27:51Z] Verbose(0) Skip the preamble. AtPreamble was True.
4-[2011-10-10 02:27:51Z] Verbose(0) not null
4-[2011-10-10 02:27:51Z] Verbose(0) Preamble found: True of size 0
4-[2011-10-10 02:27:51Z] Verbose(0) not null
4-[2011-10-10 02:27:51Z] Verbose(0) not null
4-[2011-10-10 02:27:51Z] Verbose(0) not null
4-[2011-10-10 02:27:51Z] Verbose(0) Skip the preamble. AtPreamble was False.
4-[2011-10-10 02:27:51Z] Verbose(0) Preamble found: False of size 0
4-[2011-10-10 02:27:51Z] Verbose(0) not null
4-[2011-10-10 02:27:51Z] Verbose(0) not null
4-[2011-10-10 02:27:51Z] Verbose(0) Seeking to next available part
4-[2011-10-10 02:27:51Z] Verbose(0) not null
4-[2011-10-10 02:27:51Z] Verbose(0) not null
4-[2011-10-10 02:27:51Z] Verbose(0) Key myPartName was not successfully assigned.
4-[2011-10-10 02:27:51Z] Verbose(0) Key myPartName was not successfully assigned.
4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationInterceptorContributor.WrapOperations
4-[2011-10-10 02:27:51Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:51Z] Start(1) Entering PipelineRunner: Executing contributor OperationInvokerContributor.ExecuteOperations
4-[2011-10-10 02:27:51Z] Verbose(0) Ignoring constructor, following dependencies didn't have a registration:OpenRasta.OperationModel.Interceptors.IOperationInterceptor[]
A first chance exception of type 'System.InvalidOperationException' occurred in OpenRasta.DLL
4-[2011-10-10 02:27:52Z] Error(0) An error of type System.InvalidOperationException has been thrown
4-[2011-10-10 02:27:52Z] Error(0) System.InvalidOperationException: The operation is not ready for invocation.
4-[2011-10-10 02:27:52Z] Error(0) at OpenRasta.OperationModel.MethodBased.MethodBasedOperation.Invoke() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\MethodBased\MethodBasedOperation.cs:line 56
4-[2011-10-10 02:27:52Z] Error(0) at OpenRasta.OperationModel.Interceptors.OperationWithInterceptors.<Invoke>b__0() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\Interceptors\OperationWithInterceptors.cs:line 47
4-[2011-10-10 02:27:52Z] Error(0) at OpenRasta.OperationModel.Interceptors.OperationWithInterceptors.Invoke() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\Interceptors\OperationWithInterceptors.cs:line 52
4-[2011-10-10 02:27:52Z] Error(0) at OpenRasta.OperationModel.OperationExecutor.Execute(IEnumerable`1 operations) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\OperationExecutor.cs:line 14
4-[2011-10-10 02:27:52Z] Error(0) at OpenRasta.Pipeline.Contributors.OperationInvokerContributor.ExecuteOperations(ICommunicationContext context) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\Pipeline\Contributors\OperationInvokerContributor.cs:line 29
4-[2011-10-10 02:27:52Z] Error(0) at OpenRasta.Pipeline.PipelineRunner.ExecuteContributor(ICommunicationContext context, ContributorCall call) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\Pipeline\PipelineRunner.cs:line 192
4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:52Z] Error(0) Aborting the pipeline and rendering the errors.
4-[2011-10-10 02:27:52Z] Error(0) An error has occurred and the processing of the request has stopped.
Exception:
System.InvalidOperationException: The operation is not ready for invocation.
at OpenRasta.OperationModel.MethodBased.MethodBasedOperation.Invoke() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\MethodBased\MethodBasedOperation.cs:line 56
at OpenRasta.OperationModel.Interceptors.OperationWithInterceptors.<Invoke>b__0() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\Interceptors\OperationWithInterceptors.cs:line 47
at OpenRasta.OperationModel.Interceptors.OperationWithInterceptors.Invoke() in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\Interceptors\OperationWithInterceptors.cs:line 52
at OpenRasta.OperationModel.OperationExecutor.Execute(IEnumerable`1 operations) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\OperationModel\OperationExecutor.cs:line 14
at OpenRasta.Pipeline.Contributors.OperationInvokerContributor.ExecuteOperations(ICommunicationContext context) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\Pipeline\Contributors\OperationInvokerContributor.cs:line 29
at OpenRasta.Pipeline.PipelineRunner.ExecuteContributor(ICommunicationContext context, ContributorCall call) in C:\Users\hochmuth\Repositories\openrasta-core\src\OpenRasta\Pipeline\PipelineRunner.cs:line 192
4-[2011-10-10 02:27:52Z] Verbose(0) Pipeline is in RenderNow mode.
4-[2011-10-10 02:27:52Z] Start(1) Entering PipelineRunner: Executing contributor OperationResultInvokerContributor.RunOperationResult
4-[2011-10-10 02:27:52Z] Information(0) Executing OperationResult OperationResult: type=InternalServerError, statusCode=500.
4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:52Z] Start(1) Entering PipelineRunner: Executing contributor ResponseEntityCodecResolverContributor.FindResponseCodec
4-[2011-10-10 02:27:52Z] Information(0) Selected codec HtmlErrorCodec out of 2 codecs for entity of type ServerErrorList and negotiated media type text/html; q=0.5.
4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:52Z] Start(1) Entering PipelineRunner: Executing contributor AuthenticationChallengerContributor.ChallengeIfUnauthorized
4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:52Z] Start(1) Entering PipelineRunner: Executing contributor ResponseEntityWriterContributor.WriteResponse
4-[2011-10-10 02:27:52Z] Verbose(0) Codec HtmlErrorCodec selected.
4-[2011-10-10 02:27:52Z] Start(1) Entering ResponseEntityWriterContributor: Generating response entity.
4-[2011-10-10 02:27:52Z] Verbose(0) Setting Content-Length to 2159
4-[2011-10-10 02:27:52Z] Stop(1) Exiting ResponseEntityWriterContributor
4-[2011-10-10 02:27:52Z] Verbose(0) Writing http headers.
4-[2011-10-10 02:27:52Z] Verbose(0) Writing http header Content-Length:2159
4-[2011-10-10 02:27:52Z] Verbose(0) Writing http header Content-Type:text/html
4-[2011-10-10 02:27:52Z] Stop(1) Exiting PipelineRunner
4-[2011-10-10 02:27:52Z] Information(0) Pipeline finished.
4-[2011-10-10 02:27:52Z] Stop(1) Exiting OpenRastaIntegratedHandler
4-[2011-10-10 02:27:52Z] Stop(1) Exiting OpenRastaRewriterHandler
4-[2011-10-10 02:27:52Z] Verbose(0) Request finished.
The thread '<No Name>' (0x1f68) has exited with code 0 (0x0).
答案 0 :(得分:1)
从日志中,您可以看到多部分编解码器正在键/值处理模式中使用。在该模式下,正在解析multipart的内容而不是分配IEnumerable,这肯定是该编解码器的问题。
我在https://github.com/openrasta/openrasta-core/issues/32
添加了修复此问题的错误与此同时,您可以让多部分编解码器根据需要反序列化内容(您可以通过简单地将DTO或输入参数映射到表单实体的名称来使用,OpenWrap将允许您将表单数据分配到标准属性和IFile或Stream for files)。
或者,根据您的需要,您可以通过覆盖依赖注册器来取消注册密钥/值mutlipart编解码器,并让对象注册正常工作。